Archief - [JAVA] timer

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

w00tah

Legacy Member
hallo,

Ik moet voor een project van school met java het spel 'Memory' namaken (dat spel waarbij je telkens twee van twintig omgedraaide kaartjes mag bekijken en als ze hetzelfde zijn blijven ze met de afbeelding naar boven liggen, zoniet kan je nog es proberen)

Nu ik heb een tekenPanel waar de kaarten met hun rug naar boven liggen (ik maak gebruik van de paintComponent) en door een clickEvent wordt er eentje omgedraaid. Telkens wanneer ik een tweede kaart aanklik controleert ie of het matched met de eerste kaart die werd aangeklikt, zoniet draait ie deze terug om. Dit gaat ongelooflijk snel dus zou er een timer moeten tussen komen. Ik gebruik hiervoor de volgende code:

Code:
public void paintComponent(Graphics g) {
        Afbeelding[][] kaarten = spelbord.getKaarten();
        //overloop de array om te zien welke kaarten omgedraaid mogen getoont worden en welke niet
        for (int i = 0; i < spelbord.KOLOMMEN; i++) {
            for (int j = 0; j < spelbord.RIJEN; j++) {
                g.drawImage(kaarten[j][i].getImage(), i * 100, j * 130, null);
            }
        }
}

private void formMouseClicked(java.awt.event.MouseEvent evt) {
...

        if (aantalClicks == 2) {
            aantalClicks = 0;
            try {
                //zorg ervoor dat de kaart zichtbaar wordt
                spelbord.draaiKaart(tempRij, tempKolom, true);

            } catch (InterruptedException ex) {
                Logger.getLogger(TekenPanel.class.getName()).log(Level.SEVERE, null, ex);
            }

            //wanneer de tweede kaart niet overeen komt met de eerste
            if (!spelbord.kaartenOmgedraaid[tempRij][tempKolom].getMatch()) {

                //voer paintComponent uit
                repaint();

                try {
                    //'pauzeer' een seconde, zodat de tweede kaart eventjes zichtbaar wordt
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(TekenPanel.class.getName()).log(Level.SEVERE, null, ex);
                }

                //draai de twee verkeerde kaarten terug om
                spelbord.legVerkeerdeTerug(tempRij, tempKolom);

                //voer nogmaal paintComponent uit
                repaint();
            } else {//wanneer de twee kaarten wel overeen komen laat beide zichtbaar worden
                //voer paintComponent uit
                repaint();
            }
        }
        else{//bij 1e klik
            try {
                //draai de kaart om
                spelbord.draaiKaart(tempRij, tempKolom, false);
            } catch (InterruptedException ex) {
                Logger.getLogger(TekenPanel.class.getName()).log(Level.SEVERE, null, ex);
            }
            //voor paintComponent uit
            repaint();           
        }
}

Ik ben er zeker van dat mijn code goed in elkaar gestoken is, maar telkens ik de tweede kaart aanklik blijft ie meteen de kaart omdraaien en achteraf maar een seconde wachten. Ik heb ook al ontdekt dat hij repaint(); voor de Thread.sleep(1000); niet uitvoert, maar wel de repaint(); erna (wanneer ik de repaint erna verwijder voert hij het nog steeds erna uit!

Ik heb al enkele uren/dagen gezocht om dit op te lossen, maar ik vind geen oplossing, ik hoop dat jullie me wat kunnen helpen, dat zou ik erg waarderen.:)

D3vilke

Legacy Member
private boolean bool;
private Timer t; //swing timer btw :)

public void paintComponent(Graphics g) {
if(!bool){
...code die in paintcomponent sta
}
}

private void formMouseClicked(java.awt.event.MouseEvent evt) {
bool = true;
t = new Timer(1000, new ActionListener() {

public void actionPerformed(ActionEvent e) {
boolean = false;
}
});
... rest van de code :)
}

dit is een manier waarop ge het kunt doen, zie wel da ge javax.swing.timer gebruikt dus eh :)

Cycloon

Legacy Member
D3vilke zei:

Deze code gaat je veel problemen opleveren, wanneer die bool op false gaat staan en er komt een externe reden om te repainten (kaders verslepen, ...) dan gaat het vlak niet hertekend worden en zal je een scherm krijgen die bv nog steeds de overlappende kader toont.

De reden waarom de methode met de thread.sleep() niet werkt is vrij "simpel". Wanneer een event wordt opgeworpen (in dit geval een mouseclick die wordt opgevangen) komt deze op de event-dispatch thread. Nu, wanneer je repaint gaat oproepen gaat de repaint worden verwerkt, maar het werkelijke hertekenen van het scherm komt ook op de event-dispatch thread, vermits deze momenteel bezet is door de click event moet de click event eerst helemaal afgehandeld zijn voor het scherm ook effectief kan hertekend worden. Het komt er dus op neer dat je scherm pas effectief kan hertekend worden nadat je de 2 repaints hebt opgeroepen en de events is afgewerkt. Je code doet dus wat je wil bereiken, maar het wordt pas aan de gebruiker getoond nadat alle code is afgehandeld (en dus ook het wachten en 2 maal hertekenen).

Wil je het toch gewoon met threads doen dan steek je beter die code die moet worden uitgevoerd, die nu in je click event zit, in een aparte thread zodat je click event kan worden afgehandeld en de schermen kunnen hertekend worden.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan