Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen

Chris42

Mitglied
Hallo Leute,
ich habe einen ActionListener für meine Buttons play, pause, stop.
Wenn ich den Button play drücke will ich das diverse Buttons meines Frames disabled werden um den user davon abzuhalten wären einer laufenden Simulation irgentwelche Objekte zu plazieren oder ähnliches.

Mein Problem ist das wenn ich meine jetzige ActionPerformed Methode aufrufe, alles gleichzeitig passiert, die Buttons werden disabled, der Thread wird gestartet und die Buttons werden direkt wieder enabled sodass eigentlich nichts passiert.

Wie kann ich das den bewerkstelligen das die Buttons erst wieder enabled werden wenn der Thread komplett durchgelaufen ist?

Hier meine actionperformed Methode der buttons.
Java:
@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == this.play) {
			{
				frame.simulationRunning(); // Hier werden nur die Buttons disabled
				simulation.start(); // Ausführen des Threads
				simulation = new Simulation(this.terri); // Neuen Thread anlegen um die Simulation erneut starten zu können
				frame.simulationEnded(); // Hier werden die Buttons wieder enabled
			}
		} 
	}
 
Die Referenz frame mit in deinen Thread geben und am Ende der run()-Methode dein frame.simulationEnded() aufrufen.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Test {

  public static void main(String... args) {
    new Test();
  }

  public Test() {
    JFrame frame = new JFrame("Button");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationByPlatform(true);

    JButton button = new JButton("Wait");

    Callback c = new Callback() {
      @Override
      public void call() {
        button.setEnabled(true);
      }
    };

    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        button.setEnabled(false);
        new Thread(new MySimulation(c)).start();
      }
    });

    frame.add(button);

    frame.pack();
    frame.setVisible(true);
  }

  class MySimulation implements Runnable {

    private final Callback callback;

    public MySimulation(Callback callback) {
      this.callback = callback;
    }

    @Override
    public void run() {
      try {
        TimeUnit.SECONDS.sleep(3);
      } catch (InterruptedException ex) {
        ex.printStackTrace();
      }
      callback.call();
    }

  }
}
interface Callback {

  void call();
}
 

Zurück
Oben