Swing Swing und die Threads

raphw

Mitglied
Hallo zusammen,

ich hätte eine Frage zu Swing und Threads. Und zwar wundere ich mich, ob es wirklich optimal ist z.B. ein neues Fenster einfach in der Event Queue zu schedulen.

Wenn ich einen Dialog bauen will mache ich das derzeit zum Beispiel so:

Java:
...
SwingUtitlities.invokeLater(new Runnable() {
@Override public void run() {
new MyJDialog().setVisible(true);
}});
...

Nun frage ich mich was z.B. gegen diese Lösung spricht:

Java:
...
SwingUtitlities.invokeLater(new SwingWorker<MyJDialog,Void>() {
@Override public MyJDialog doInBackground() throws Exception {
return new MyJDialog();
}
@Override done() {
try { get().setVisible(true); } catch(Exception ignore) { }
}});
...

Das Ergebniss wäre doch eigentlich das gleiche und auch sicher wenn der Konstruktor nicht selbst setVisible aufruft. Oder etwa nicht? Die Komponenten wären damit noch nicht realisiert, allerdings wäre die EventQueue in der Zwischenzeit frei, sofern es etwas länger dauern sollte, bis der Dialog geladen ist würde die GUI also nicht einfrieren.

Oder wäre es besser alle Dialoge schon bei Programmstart zu laden und sie dann nur noch auf visible zu setzen? Ich habe nicht die Erfahrung um mir hier ein Urteil zu bilden, darum dachte ich, ich frage einmal nach. Danke und viele Grüße! Rafael
 

tagedieb

Top Contributor
Wenn die Erstellung des Dialogs etwas laenger dauert weil du zum Beispiel Daten aus der Datenbank lesen musst wuerd ich das im Main oder in einem extra Thread machen. Der Event-Thread sollte sich nur um GUI-Events und die Darstellung des GUIs kuemmern.

.setVisible(..) setzt den Flag und erzeugt dann ein Event zum darstellen der Komponente im Event-Thread.

Einen einfachen Dialog aufzubauen kann man auch im Event-Thread ausfuehren (solange keine zeitintensiven operationen ausgefuehrt werden)

Mit SwingUtitlities.invokeLater(...) laesst du explizit den Code im Event-Thread ausfuehren was dann dein GUI blockieren kann
 

André Uhres

Top Contributor
Hallo Rafael,

die Regel ist, dass alle Swing Komponentenmethoden vom EventDispatchThread aus aufgerufen werden müssen, also nicht nur die Methode "setVisible(..)".

Programme, die diese Regel ignorieren, können zwar die meiste Zeit korrekt funktionieren, können aber auch zu unvorhersehbaren Fehlern führen, die schwer reproduzierbar sind.

Wenn die Initialisierung eines Dialogs zu lange dauert, liegt meiner Meinung nach ein tieferer Konzeptfehler vor, den wir nicht auf eine oberflächliche Art lösen sollten.

Gruß,
André
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Interessanterweise ist der genaue Wortlaut der "Single Thread Rule"


Once a Swing component has been realized, all code that might affect or depend on the state of that component should be executed in the event-dispatching thread. ( Threads and Swing )

Später wird dann noch erläutert:
Realized means that the component's paint() method has been or might be called. A Swing component that's a top-level window is realized by having one of these methods invoked on it: setVisible(true), show(), or (this might surprise you) pack()

Theoretisch sollte also der Konstruktor Thread-safe sein (und eigentlich beliebiges, solange die Component nicht realized ist).

Ist es aber nicht

Darum ist André Uhres' Pauschalisierung gerechtfertigt. Solange bei einer Methode nicht explizit dabei steht, dass sie Thread-safe ist, muss man davon ausgehen, dass sie es NICHT ist.
 

raphw

Mitglied
Danke für die Antworten. Auf Grund genau diesen Satzes hatte ich meinen Dialog auch so konzipiert wie oben geschildert. Er dauert auch gar nicht sooo lange, es ist nur einfach angenehmer für mich, wenn ich Stuktur un Daten in "einem Wisch" erledigen kann, da ich diesen spezifischen Dialog anschließend nicht mehr brauche: Aber mit diesem Wissen trenne ich nun einfach das Vorladen der Daten vom Aufbau des Dialogs; wissen muss man es eben nur.
 
G

Gast2

Gast
Danke für die Antworten. Auf Grund genau diesen Satzes hatte ich meinen Dialog auch so konzipiert wie oben geschildert. Er dauert auch gar nicht sooo lange, es ist nur einfach angenehmer für mich, wenn ich Stuktur un Daten in "einem Wisch" erledigen kann, da ich diesen spezifischen Dialog anschließend nicht mehr brauche: Aber mit diesem Wissen trenne ich nun einfach das Vorladen der Daten vom Aufbau des Dialogs; wissen muss man es eben nur.

Die Daten sollten ja in einem Model sein und die sollten mit einem Service o.ä. geholt werden und somit unabhängig vom Dialog sein.
Darum sollte in der doBackground irgendwas stehen service.loadXYZ();
Und der GUI werden die Daten dann übergeben und die ist dann nur für das rendern zustädnig...
 

raphw

Mitglied
Stimme ich dir grundsätzlich auch zu und die Daten liegen in einem Object, das die GUI bekommt. Das Objekt holt sich die Daten nur wiederum aus dem Netzwerk, sobald sie angefordert werden und das dauert. Darum überhaupt die Frage.
 
G

Gast2

Gast
Stimme ich dir grundsätzlich auch zu und die Daten liegen in einem Object, das die GUI bekommt. Das Objekt holt sich die Daten nur wiederum aus dem Netzwerk, sobald sie angefordert werden und das dauert. Darum überhaupt die Frage.

Ja wenn der Dialog die Daten SOFORT braucht. Dann musst du das Object im Hintergrund laden und solange einen Warte Dialog anzeigen.

Oder das Object im Hintergrund laden und danach den im done Dialog erzeugen (was ja dann schnell gehen sollte).
 

CroniD

Aktives Mitglied
Also bezüglich Swing und Threads kann ich folgenden Artikel empfehlen:
The Single Thread Rule in Swing | Java.net

Veranschaulicht auch mit Code-Beispielen was nicht so schön ist. Ich denke da werden alle Fragen von dir beantwortet. :)

Allerdings kann man ein paar Grundregeln aufstellen:
1. erzeuge das Haupt GUI Element im EDT (i.d.R. ein Frame) und setze es auch dort auf visible
2. alle weiteren Aufgaben, die nichts mit der GUI am Hut haben (Datenbestände laden z.B.) mit Hilfe des SwingWorkers abarbeiten
3. für unglaublich, sehr, sehr lange Aufgaben, die nichts mit der GUI zu tun haben: eigene angepasste SwingWorker Implementierung schreiben

Grundsätzlich, wenn du 1. befolgst bist du mit allen Listenern usw. im EDT. Die 2. Regel lässt sich immer gut mit eigenen Service Klassen realisieren. Ich persönlich halte mir in diesen statische Methoden die eine Standardaufgabe erledigen. Wegen 3.: Manchmal kann die Implementierung des SwingWorkers hinderlich sein. Beispielsweise bei sehr großen Dateioperationen. Hatte es bisher einmal, dass ich ihn selber schreiben musste, was mir dann weniger CPU und Speicherlast bescherte. War also eher aus Optimierungsgründen. ^^
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
C Threads Swing AWT, Swing, JavaFX & SWT 11
S Java Swing GUI mit MVC und Threads AWT, Swing, JavaFX & SWT 6
B Threads in Swing AWT, Swing, JavaFX & SWT 4
R Swing Java Swing Gui und nebenläufige Threads AWT, Swing, JavaFX & SWT 4
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
A Swing und Threads AWT, Swing, JavaFX & SWT 8
R Swing & Threads AWT, Swing, JavaFX & SWT 4
P Threads und Swing bzw. AWT AWT, Swing, JavaFX & SWT 15
W Swing, 2 JProgressbars und threads geht das? AWT, Swing, JavaFX & SWT 2
K Swing und Threads AWT, Swing, JavaFX & SWT 11
M Threads in Swing? AWT, Swing, JavaFX & SWT 2
V Swing & Threads ??? AWT, Swing, JavaFX & SWT 3
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
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

Ähnliche Java Themen

Neue Themen


Oben