Swing Swing und Edt

ARadauer

Top Contributor
Ich muss ehrlich sagen, dass ich bis vor Kurzem die Problematik mit dem Event Dispatcher Thread nicht wirklich verstanden habe... jetzt lese ich gerade filthy rich clients und jetzt wird die Sache klarer...

also:
1. Immer wenn ich Swing Komponenten bearbeite, erzeuge usw.. sollte das im EDT geschehen
2. Immer wenn ich Dinge mache die nicht Swing betreffen (Fachlogik) sollte das nicht im EDT geschehen

also sowas ist vollkommen falsch

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;


public class Test extends JFrame implements ActionListener
{
	
	public static void main(String[] args){
		Test f = new Test();
		JButton button = new JButton("test");
		button.addActionListener(f);
		f.add(button);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.pack();
		f.setVisible(true);
	}

	public void actionPerformed(ActionEvent e){
		System.out.println("Button wurde geklickt");
		System.out.println("berechnungs usw...");
		try{
			Thread.sleep(2000);
		}catch (InterruptedException e1){}
		System.out.println("fertig");		
	}

}

aber nicht nur, weil die Berechnung im Edt ausgeführt wird... sondern auch weil das Erzeugen der Gui Kommponenten nicht im EDT ausgeführt wird oder?

so würde es richtig sein, oder?

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class Test extends JFrame implements ActionListener{
	
	public static void main(String[] args){
		
		SwingUtilities.invokeLater(new Runnable(){
			
			@Override
			public void run(){
				Test f = new Test();
				JButton button = new JButton("test");
				button.addActionListener(f);
				f.add(button);
				f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				f.pack();
				f.setVisible(true);				
			}
		});		
	}

	public void actionPerformed(ActionEvent e){
		new Thread(new Runnable(){			
			@Override
			public void run(){
				System.out.println("Button wurde geklickt");
				System.out.println("berechnungs usw...");
				try{
					Thread.sleep(2000);
				}catch (InterruptedException e1){}
				System.out.println("fertig");	
				
			}
		}).start();			
	}
}
aber sorry, ist dann swing nicht irgendwie eine fehlkonstruktion?

Immer wenn ein event erzeug wird und ich in den meisten fällen fachlogik ausführe muss ich einen thread erzeugen? Warum kann das swing nicht für mich machen?

Immer wenn ich Gui Komponenten erzeuge muss ich das explizit mit SwingUtilities.invokeLater machen? Auch nicht sehr intuitiv...

Was sagt ihr dazu?
 

andiv

Bekanntes Mitglied
Der Hintergrund hinter dem ganzen ist ja, dass Swing nicht threadsafe ist und dass es auch nicht sinnvoll ist eine multithreading-fähige GUI-Bibliothek zu schreiben. Der Ansatz alle Zugriffe auf GUI-Elemente nur im EventDispatcherThread zu machen hat sich eben durchgesetzt.

Daraus folgt wie du richtig erkannt hast, dass du die Initialisierung der GUI auch schon im EDT machen solltest mit SwingUtilities.invokeLater(...).

Der Code in den ActionListenern wird von Swing automatisch im EDT ausgeführt, damit du problemlos auf die GUI-Elemente zugreifen kannst, was du ja in den meißten Fällen auch willst. Du kannst auch ohne Weiteres Berechnungen im EDT durchführen.

Der Punkt ist halt, dass wenn deine Berechnungen lange dauern, dass dann die GUI nicht mehr reagiert, weil du eben den EDT blockierst. Deshalb solltest du längere Berechnungen in einem Hintergrundthread ausführen, damit die GUI weiterhin flüssig reagiert. Dabei hilft dir die Klasse SwingWorker, die auch die Rückgabe von Ergebnissen erleichtert um dann im EDT wiederum die GUI zu aktualisieren.

Ja, ich finde auch, dass das ziemlich umständlich klingt, aber nach allem was ich bisher gelesen habe, scheint es noch keinen besseren Ansatz für das ganze zu geben.
 

Landei

Top Contributor
Closures in Java 1.7 können das Problem entschärfen, aber im Prinzip hast du recht, es ist umständlich. Aber du bringst mich auf eine gute Idee: In meinem Projekt Swirrel könnte ich auch "Listener im neuen Thread" anbieten, wie actionPerformed in deinem korrekten Beispiel.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hmja. Speziell das Erzeugen ist kein so großer Aufwand: Man hat üblicherweise EINE Stelle, wo das GUI gebaut wird, und diese eine Stelle wickelt man in SwingUtilities ein. Wenn später noch Components hinzukommen, und meistens auch bei anderen Änderungen, passiert das ohnehin aufrund von anderen Aktionen, die schon über den EDT laufen (Z.B. Buttonklick -> Neues Fenster aufmachen oder so). Wenn nicht, macht man eben ein SwingUtilities drum - das ist auch recht kompakt und einfach.

Die umgekehrte Richtung ist in letzter Konsequenz ein bißchen... diffiziler. Wenn man ein Threadsicheres Modell hat, kann man das auch vom EDT aus verändern - sofern die Veränderung nicht lange dauert. Natürlich kann man das ggf. nicht immer mit Bestimmtheit sagen. Sowas wie [c]model.setSomeFlag(true);[/c] kann man auch direkt vom EDT aus machen. Sowas wie [c]model.readFromDataBase(hugeThing);[/c] eher nicht. Für solche Sachen gibt es mit dem SwingWorker aber ein Werkzeug, das einem da einiges an Arbeit abnimmt.

Ansonsten steht es jedem frei, ein besseres, Multi-Threading-Fähiges GUI Toolkit zu bauen. Wenn man nach der Lektüre von Multithreaded toolkits: A failed dream? | Java.net noch den Mut dazu hat :D

IMHO wird die Frage bei einem Punkt besonders interessant: Ein Modell läuft in einem Thread, und benachrichtigt auf diesem Thread seine Listener über seinen Fortschritt. Wenn einer der Listener eine Swing-Component ist (oder er eine solche verändert) muss er beim Aufruf der Listener-Methoden sicherstellen, dass der Event vom Modell-Thread auf den EDT umgebogen wird. Ich hatte da mal was gebastelt ... http://www.java-forum.org/awt-swing-swt/94565-model-listener-background-jobs.html#post600770 ... aber bin noch nicht zum dort angesprochenen "Aufbohren" gekommen... (@Landei: ... aber vermutlich würdest du in Swirrel dann soweiso schon sowas ähnliches machen... ;) )
 

Landei

Top Contributor
@Landei: ... aber vermutlich würdest du in Swirrel dann soweiso schon sowas ähnliches machen... ;)

Nur um Missverständnisse zu vermeiden: Bei Swirrel geht es ausschließlich um Listener bzw. Actions, es hilft nicht im geringsten beim Aufbau der GUI, d.h. da muss man sich selber um die richtigen Threads kümmern. Was (zumindest konzeptionell) ganz einfach zu implementieren ist, ist die Möglichkeit, dass der Nutzer über einen Schalter an meinen Annotations sagt, wo der Listener-Code ausgeführt werden soll: Wie bisher im EDT oder in einem neuen Thread. Ich habe gerade meine Änderungen ins SVN eingecheckt - das war wirklich eine ziemliche Tipperei. Aber ich muss erst noch ein wenig testen und ein hübesches Beispiel schreiben, bevor ich ein neues Release mache.
 

Marco13

Top Contributor
Ne, also bei mir lag da kein Mißverständnis vor. Ich hatte mir Swirrel noch nicht näher angesehen, aber schon erwartet, dass dort für die gleiche Funktionaliät, die mit dieser Proxy-Klasse erreicht wurde, im Endeffekt "nur" ein boolean (in diesem Fall 'treaded') irgendwo hinzugefügt werden müßte. ("nur" in Anführungzeichen, weil dieses 'irgendwo' sich dabei eben nicht auf nur EINE Datei bezog ;))
 

Landei

Top Contributor
Korrekt. Statt
Code:
@ActionPerformed("meineMethode")
muss man nur
Code:
@ActionPerformed(value = "meineMethode", threaded = true)
schreiben, dann funktioniert es. Hier ist die Testklasse, in der die gleiche 10s lang blockierende Methode von zwei Buttons aufgerufen wird, einmal im EDT, einmal im neuen Thread.
 
Zuletzt bearbeitet:
G

Gast2

Gast
Die Porblematik bei SWT nicht anders. Außer dass man eine Exception bekomm wenn man auf GUI Elemente im flaschen Thread zugreift(was sehr gut ist), was bei Swing nicht der Fall ist.
In einem Framework(z.B. eclipse RCP) gibt es auch schon einige Klassen um diese Problematik angenehm und einfach zu gestalten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Swing Swing - Eigene Komponenten erstellen AWT, Swing, JavaFX & SWT 17
W Swing GUI - Komponenten platzieren AWT, Swing, JavaFX & SWT 14
XWing Jave swing overly benutzten. AWT, Swing, JavaFX & SWT 3
J Anzeige ID und Markierung für Knoten in Eclipse & Swing AWT, Swing, JavaFX & SWT 4
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben