AWT Button reagiert nicht

JanStre

Mitglied
Hallo,

bei meinem aktuellen Projekt habe ich das Problem, dass die Buttons meiner GUI unter einer bestimmten Situation nicht ansprechbar/drückbar sind, und somit auch keine Events und die dazugehörigen Routine (actionperformed) auslösen können.

Grundsätzlich funktionieren bei mir die Buttons nur, wenn momentan kein anderer Thread läuft oder while(true)-Schleife läuft. Sobald ich in eine solche Schleife gerate, sind die Buttons nicht mehr ansprechbar.

Ich wollte (bevor ich ein Minimalbeispiel eintrage) fragen, ob das Problem bekannt ist und wenn ja, wie es einfach behoben werden kann.

Grüße
Jan
 
Threads ist ein Stichwort, normalerweise haben Anfänger die beschriebenen Probleme, weil sie eben keine Threads verwenden sondern von ActionListenern aus lange Berechnungen/ Schleifen starten,
solange Listener, vom AWT-Thread ausgeführt, nicht beendet sind, reagiert die GUI nicht, zeichnet sich auch nicht neu,

erstmal gilt also: Threads verwenden, Aktionen nebenläufig ausführen

normalerweise bekommt dann die GUI automatisch auch Luft zwischendurch, das ist aber anscheinend nicht immer so, wie ich erst kürzlich lernen musste, siehe
http://www.java-forum.org/allgemein...ithreading-scheduling-problem.html#post654023

yield() könnte also helfen, oder gar ein sleep()
 
Hier vorerst mal ein Minimalbeispiel, das das bekannte Problem vorerst ohne Threads zeigt, aber die gleichen Auswirkungen hat.

Java:
public class Main {

	public static void main(String[] args) {
		MyJFrame myjframe = new MyJFrame();
	}

}

Java:
public class MyJFrame extends JFrame implements WindowListener {

	private static final long serialVersionUID = 1L;
	public MyJFrame() throws HeadlessException {
		super();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(100, 100);
		this.setVisible(true);
		this.setResizable(false);
		this.setTitle("Fenster-Titel");
		this.setLayout(new GridBagLayout());

		Button testbutton = new Button("Testbutton");
		Button startloop = new Button("Starte while(true)");
		MyButtonListener mybuttonlistener = new MyButtonListener();
		testbutton.addActionListener(mybuttonlistener);
		startloop.addActionListener(mybuttonlistener);
		add(testbutton);
		add(startloop);
	}

	public void windowActivated(WindowEvent e) {}
	public void windowClosed(WindowEvent e) {}
	public void windowClosing(WindowEvent e) {
		dispose();
		System.exit(0);
	}
	public void windowDeactivated(WindowEvent e) {}
	public void windowDeiconified(WindowEvent e) {}
	public void windowIconified(WindowEvent e) {}
	public void windowOpened(WindowEvent e) {}

}

Java:
public class MyButtonListener implements ActionListener {

	public MyButtonListener() {
	}

	public void actionPerformed(ActionEvent actionevent) {
		String actioncommand = actionevent.getActionCommand();
		if(actioncommand.equals("Starte while(true)")){
			Testklasse testobjekt = new Testklasse();
		}
		System.out.println("Testausgabe");
	}

}

Java:
package eve.robot;

public class Testklasse {

	int x;
	
	public Testklasse(){
		this.x = 0;
		start();
	}
	
	public void start(){
		while(true){}
	}
}

Generell habe ich es auch schon mit einem Thread (nicht im Minimalbeispiel vorhanden) versucht, ich denke mir fehlt aber noch das schlüssige Konzept dazu. Bisher wird am Anfang über die main() ein Fenster und ein Thread gestartet. Das Fenster enthält Buttons, die actionperformed() auslösen bzw darin ein neues Testobjekt gestartet wird, das eine while(true)-Schleife enthält. Wie sollte ich den Thread also am besten benutzen?
 
nun ja, was soll man da sagen,
du brauchst einen Thread, ist das noch nicht klar geworden?

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.25 AWT, Swing und die Threads

im einfachsten Fall
Java:
actionPerformed
new Thread() {
  public void run() {
    // hier der Code des ActionListeners
  }
}.start();
nett ist auch eine neue ActionListener-Basisklasse, die in einem Thread eine runX()-Methode aufruft, welche man überschreiben muss,
dann hat man nicht den komischen Thread-Code direkt in der GUI
 
Und nicht zu vergessen, dass Swing- und AWT-GUI-Komponenten nicht gemischt werden sollten.
Also entweder MyJFrame von Frame erben lassen, oder die Buttons zu Swing-Buttons (JButton) machen.
Die zweite Variante solltest du in jedem Fall vorziehen.
 

Zurück
Oben