Swing [gelöst] GUI-Befehle bleiben wirkungslos, wenn danach was großes gemacht wird.

Status
Nicht offen für weitere Antworten.
Hi,

in meiner Applikation wird durch einen Knopfdruck eine ggf. lange (da rekursive) Berechnung durchgeführt. Damit der User sieht, das gerade was passiert, möchte ich die GUI deaktivieren (mit bla.setEnabled(false)) und einen kleinen Text in ein vorhandenes JTextArea ("Vorgang wird berechnet") packen. Klarer Fall:
Java:
	public class GoButtonListener implements ActionListener {

		public void actionPerformed(ActionEvent pE) {
			_viewController.setGuiEnable(false); //ruft bei den gui-komponenten den setEnabled(boolean) auf
			_evaluationTextArea.setText("Wird verarbeitet");

			// hier kommen viele, lange Berechnungen...

			_evaluationTextArea.setText(_auswertungsString);
			_viewController.setGuiEnable(true);
		}

Doch leider, wird die GUI nicht deaktiviert, der Text nicht gesetzt, sondern gleich losgerechnet. Nehme ich die Berechnung raus, so wird die GUI brav deaktiviert. Wie ist dieses Verhalten zu erklären?
 
Zuletzt bearbeitet:
OK ich habs jetzt hinbekommen, aber leider verstehe ich immer noch nichts ganz das Warum.

Also ich habs so verstanden: GUI-Interaktion bzw. das gesamte Listening wird in dem sog. Event Dispatch Thread ausgeführt (das gilt auch für mein actionPerformed()). Nun habe ich dort aber meine lange Berechnung drinne, was den Thread natürlich beansprucht, sodass er nicht mehr auf weiter GUI-Interaktionen reagiert. Soweit so gut, aber warum konnte ich die GUI dann nicht disablen? Ich habe den Befehl doch vor (!) der langen Berechnung gegeben. Oder seit wann wird die 3. Anweisung vor der 1. und 2. ausgeführt??

Weitere komische Sache: Wenn einen neuen Thread "händisch" starte:
Java:
		public void actionPerformed(ActionEvent pE) {
			_viewController.setGuiEnable(false);
			_evaluationTextArea.setText("Wird verarbeitet");

			Runnable runnable = new CountLinesRunnable();
//			SwingUtilities.invokeLater(runnable);
			Thread thread = new Thread(runnable);
			thread.run();

		}
wird die GUI auch nicht deaktiviert, warum das? Ich starte die Rechnung doch im eigene Thread, sodass der Event Dispatch Thread wieder frei ist, um die GUI zu deaktiveren. Lediglich das Starten über SwingUtilities.invokeLater(runnable) bringt das gewünschte Verhalten... das versteh ich nicht.
 
S

SlaterB

Gast
was bedeutet
> _viewController.setGuiEnable(false);

einen solchen Befehl in der Luft kann niemand beurteilen,
wie stellst du fest, ob die GUI enabled ist oder nicht? wenn sie blockiert kannst eh nichts mit der GUI machen,
neu gezeichnet wird auch nicht, so lange blockiert ist, falls du das meinst,

> Wenn einen neuen Thread "händisch" starte:

run() führt nur die Methode nomal aus,
start() startet per Magie einen eigenen Thread

> Lediglich das Starten über SwingUtilities.invokeLater(runnable) bringt das gewünschte Verhalten...

damit wird der ActionListener sogleich beendet, die Auswirkungen von setGuiEnable() können umgesetzt werden,
und danach kommt dann CountLinesRunnable dran,

da während dessen Ausführung dann die GUI blockiert ist, ist das aber keine wirklich Alternative, lieber den Thread richtig starten
 
Vielen Dank für deine Antwort.

Hab jetzt die ganze Materie durchdrungen.

Der Event Dispatch Thread kümmert sich um Dinge wie das Repaint und das ausführen des Eventhandlings, zb. der actionPerformed()-Methode. Wenn ich nun eine aufwändige Berechnung im actionPerformed() habe, so wird diese vom Event Dispatch Thread ausgeführt, während dessen kann er aber nicht die GUI repainten, sodass GUI-Änderungen (knopf.setEnabled(false) etc.) zwar vermerkt sind, aber (noch) keine Wirkung zeigen.

SwingUtilies.invokeLater(Runnable) schiebt ein run-Vorgang in den Event Dispatch Thread (genauer gesagt, wird dieser nach actionPerformed() ausgeführt), daher erfüllt das zwar meinen zweck, ist aber nicht besonders hübsch, da während dessen keine GUI-Interaktion möglich sind.

Lange Rede kurzer Sinn: Einfach einen separaten Thread mit start() (;-)) starten, in welchen dann die GUI am Ende wieder aktiviert wird und dann klappts auch mit dem Nachbarn. =)

So Danke an SlaterB und meinem OOP-Dozenten. ;)

PS: mein setGuiEnabled(boolean) hat lediglich eine Reihe von Befehlen wie knopf.setEnabled(boolean); gekapselt.
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Swing [Gelöst]Radiobuttons "Verknüpfen" AWT, Swing, JavaFX & SWT 3
H Puzzle - Erkennen wenn gelöst (array vergleichen) AWT, Swing, JavaFX & SWT 10
Pithecanthropus [gelöst] JTree, aber nicht mit Strings, sondern mit Objects? AWT, Swing, JavaFX & SWT 2
Pithecanthropus [gelöst ]ActionListener soll nur Änderungen "bemerken" AWT, Swing, JavaFX & SWT 2
H [gelöst] Swing Elemente verdecken AWT, Swing, JavaFX & SWT 14
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
H Swing [gelöst]Neues Swing Element erstellen AWT, Swing, JavaFX & SWT 4
J [gelöst] nicht installierte Schrftart nutzen AWT, Swing, JavaFX & SWT 8
M Swing [gelöst] JTable: Edit abstellen AWT, Swing, JavaFX & SWT 3
S [gelöst] API zum bequemen Navigieren und Auswählen von Ordnern AWT, Swing, JavaFX & SWT 3
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
Dragonfire ZoomImage flackert -> Fehler: repaint-Aufruf [gelöst] AWT, Swing, JavaFX & SWT 5
P [gelöst] Verschiebbare Komponenten mit Linien verbinden AWT, Swing, JavaFX & SWT 2
J [gelöst] repaint problem AWT, Swing, JavaFX & SWT 2
A [gelöst] Grundlagenfehler AWT, Swing, JavaFX & SWT 2
R Gelöst: panelGrösse innerhalb eines JFrames AWT, Swing, JavaFX & SWT 7
M problem mit repaint()-Methode[gelöst] AWT, Swing, JavaFX & SWT 8
ModellbahnerTT [gelöst]Frage und Problem zu Swing AWT, Swing, JavaFX & SWT 4
G [gelöst] "Größe" von drawString AWT, Swing, JavaFX & SWT 4
T [gelöst] JFrame Grundlagen (Größe und Darstellung) AWT, Swing, JavaFX & SWT 6
E Inhalt einer JComboBox ... -gelöst AWT, Swing, JavaFX & SWT 2
R Button-Befehle werden nicht ausgeführt AWT, Swing, JavaFX & SWT 4
_user_q [JavaFX] Spinner so einstellen, dass er nicht leer bleiben darf? AWT, Swing, JavaFX & SWT 6
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
A Swing Koordinatensystem wird gezeichnet verschwindet aber und die Einteilungen bleiben nicht bestehen AWT, Swing, JavaFX & SWT 5
S Hauptfenster soll geöffnet bleiben AWT, Swing, JavaFX & SWT 4
C JTable Datensätze bleiben immer gleich AWT, Swing, JavaFX & SWT 14
S Frameübergreifend in Datenbank eingeloggt bleiben AWT, Swing, JavaFX & SWT 9
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
M Menübar soll bestehen bleiben, wenn andere Masken geöffnet werden AWT, Swing, JavaFX & SWT 4
W GridBagLayout - Größenverhältnisse bleiben nicht stabil AWT, Swing, JavaFX & SWT 2
F JToggleButton in AWT umsetzen (Button soll stecken bleiben) AWT, Swing, JavaFX & SWT 4
ElViZ JCheckBoxMenuItem Problem - Menü soll offen bleiben. AWT, Swing, JavaFX & SWT 3
H JMenu soll "offen bleiben" AWT, Swing, JavaFX & SWT 3
M Scrollprobleme - Panelinhalte bleiben beim Scrollen AWT, Swing, JavaFX & SWT 2
P JOptionPane soll vorne bleiben AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben