Thread.sleep(500) bei Klick auf JButton verhält sich unerwartet bzw. anders als gewollt



  • Ich bin dabei ein kleines Spiel zu schreiben. Ähnlich wie Black Jack.

    Bei einem Klick auf einen JButton soll nun eine Zufallszahl für den Spieler erzeugt und in einem Label ausgegeben werden. Zusätzlich wird in einem anderen Label noch die Gesamtzahl festgehalten. Wenn der Spieler seinen neuen Wert bekommen und ausgegeben bekommen hat ist der Computer dran und bekommt ebenfalls einen neuen Zufallswert.
    Mein Gedanke war jetzt, dass bevor der Computer seine Karte bekommt das Programm mit Thread.sleep(500) mal ein Weilchen warten soll, weil das unschön aussieht, wenn der Spieler und der Computer beide neue Karten zum gleichen Zietpunkt bekommen, da der Button aus Anwendersicht eigentlich nur dazu gedacht ist dem Spieler eine neue Karte zu geben.

    Hier erstmal der Code:

    } else if(evt.getSource() == getCard) {
    			Random rand = new Random();
    			int newCardValue = rand.nextInt(10)+1;
    			absValuePlayer += newCardValue;
    			newCardLabelPlayer.setText(Login.profileName + " bekommt eine " + newCardValue + "    ");
    			absValueLabelPlayer.setText(Login.profileName + " hat " + absValuePlayer);
    
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException e) {}
    
                newCardValue = rand.nextInt(10)+1;
    			absValueCPU += newCardValue;
    			newCardLabelCPU.setText("CPU bekommt eine " + newCardValue + "             ");
    			absValueLabelCPU.setText("CPU hat " + absValueCPU);
    		}
    

    Das Problem ist nun, dass das Programm nicht wartet nachdem beim Spieler Label die neuen Zahlen drinstehen, sondern sofort wenn man den Button angeklickt hat und dann bekommen Spieler und Computer trotzdem noch zum gleichen Zeitpunkt ihre neuen Werte.

    Wieso ist das denn jetzt so? Der Reihenfolge nach soll er doch erst nach dem setText für das SpielerLabel warten und dann nach der Wartezeit das selbe für das CPULabel tun.

    Ich danke schonmal fürs Durchlesen und Antworten.



  • Naja, wahrscheinlich fliegt eine InterruptedException. Meine Vermutung: Du befindest dich da noch im EventThread obwohl du das eigentlich außerhalb hättest machen sollen. Nun wird eine andere Nachricht ankommen im EventThread und dein sleep wahrscheinlich interrupten. Ist aber nur meine Vermutung.

    MfG SideWinder



  • Glaube ich ehrlich gesagt nicht. Die Wartezeit verstreicht ja komplett.

    Edit: Hab's jetzt auch mal getestet und beim catch ein System.out.println gemacht. Die Konsole bleibt leer. Also kommt da schonmal keine InterruptedException.



  • Ersetze mal die 500 durch 5000, dann wirst du merken ob da wirklich nicht gewartet wird. BTW: Thread.sleep() im EventThread ist - egal ob interrupted oder nicht - eine sehr böse Angelegenheit. Dein Fenster kann in dieser Zeit nicht auf andere Eingaben reagieren. Also besser ab mit dem ganzen Event-Handling-Code in einen anderen Thread!

    MfG SideWinder



  • OK, ich habe vorher nur den Main Thread gehabt. Jetzt habe ich noch einen Thread gestartet und jetzt funktioniert das so. Danke. 🙂


Anmelden zum Antworten