Methoden Methode führt Ende vor dem Anfang aus

mathiasj

Bekanntes Mitglied
Hallo,
ich nehme in der Methode actionPerformed() einige Operationen vor. Am Ende soll der Computer einen Zug machen. Das Problem ist aber, dass er zwar die Operationen aufruft(mit println() herausgefunden), sie aber nicht ausführt...

Java:
public class button0Listener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
      if (spielerDran) {
        buttons[0].setDisabledIcon(X);  //All das wird nicht ausgeführt?
        buttons[0].setEnabled(false);
        buttons[0].setName("X");
        spielerDran = false;
        amZug.setText("Computer ist am Zug");
        frame.revalidate();
        computerZug();
    }
  }
  }

In computerZug() wird der Thread zum schlafen gebracht(Zugzeit des Computers) und dann wird das Icon von einem anderem Button geändert. Aber ich drücke auf dem Knopf, muss warten, bis die Zugzeit des Computers vorbei ist, und dann ändern sich auf einen Schlag beide Icons... Genauso ist es mit dem Namen der Buttons...
 
Der EDT wird blockiert. Die actionPerformed()-Methode muss so schnell wie möglich die Kontrolle an den EDT zurückgeben.
Die Operationen müssen also in einem eigenen Thread ablaufen.
Du kannst die Forumsuche mal mit "EDT" oder "Event Dispatcher Thread" füttern, da sollten genügend Ergebnisse gefunden werden.
 
Nein, buttons[0] hat einen Wert.

Das heißt, der EDT macht alleDinge mit der GUI? Wie muss ich das dann mit meinem eigenen Thread machen? Habe grade ein bisschen rumprobiert, es kam aber nicht gutes dabei raus... Aber es liegt nicht an dem Thread.sleep(), oder?
 
Habe grade ein bisschen rumprobiert, es kam aber nicht gutes dabei raus...
Wir können nicht wissen, was du probiert hast, wenn du uns keinen Code zeigst.

Aber es liegt nicht an dem Thread.sleep(), oder?
Doch, genau dadurch wird der EDT schlafen gelegt und somit friert die GUI ein.

Für was muss ich denn dann einen Thread schreiben, und wie sollte der ungefähr aussehen?
Ungefähr so:
Java:
public class button0Listener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
      if (spielerDran) {
        buttons[0].setDisabledIcon(X);  //All das wird nicht ausgeführt?
        buttons[0].setEnabled(false);
        buttons[0].setName("X");
        spielerDran = false;
        amZug.setText("Computer ist am Zug");
		new Thread(new Runnable() {
			@Override
			public void run() {
				computerZug();
			}
		}).start();
    }
  }
  }
Du schriebst, dass in
Code:
computerZug()
auch Änderungen an der GUI vorgenommen werden. Diese wiederum müssen dann wieder im EDT ausgeführt werden. Dies macht man so:
Java:
void computerZug() {
	// warten
	// Zug ausführen
	SwingUtilities.invokeLater(new Runnable() {
		@Override
		public void run() {
			// GUI ändern
		}
	});
}
Man sollte dies aber nicht selbst mit Threads machen. Besser macht man es mit dem [JAPI]SwingWorker[/JAPI]. Lies dir dafür diesen Tutorial-Abschnitt gründlich durch.
 
Ah, vielen Dank! So lernt man noch etwas dazu 😉

Aber warum friert die GUI genau ein? Weil ich mit dem Thread.sleep() doch den EDT schlafn lege; dadurch kann sich dann auch nicht die GUI ändern, oder? (Nur zum Verständnis)
 
Es gibt eine [JAPI]EventQueue[/JAPI]. Dort werden alle GUI-Änderungen als Events reingelegt. Der EDT arbeitet diese nacheinander ab. Schläft dieser, kann er die Events natürlich nicht abarbeiten. In diesem Zeitraum wirkt die GUI eingefroren.
 

Zurück
Oben