Blockierende Methode im EDT, modaler JDialog

Status
Nicht offen für weitere Antworten.

patb

Mitglied
Hallo,

ich würde gerne eine kleine Animation abspielen, bevor ich einen JDialog öffne. Sagen wir, die Animation beschränkt sich zunächst erstmal auf das Bewegen eines JPanels von links nach rechts. Meine Frage bezieht sich weniger auf die Animation, sondern vielmehr darauf, wie ich es schaffe, die Animation zu starten und nach deren Ende den JDialog zu öffnen.

Nehmen wir mal folgenden Beispielcode (die Methode ist innerhalb einer Klasse, die von JDialog abgeleitet ist, die Klasse stellt einen modalen Dialog dar):

Code:
public void openDialog() {

	playAnimation();
	
	setVisible(true);  // ***
	dispose();
}

Die "***" Stelle ist noch besonders. Laut Java API Doku wird dort der aktuelle Thread angehalten und erst wieder fortgesetzt, wenn z.B. irgendwo "setVisible(false)" für den Dialog aufgerufen wird. Dies macht natürlich Sinn. Sehr entscheidend dabei ist, dass ein neuer "Event-Pump-Thread" bzw. "Event-Dispatching-Thread" vom Toolkit geöffnet wird (steht in der API Doku zu setVisible vom JDialog). Warum ist ja klar, damit die GUI nicht blockiert, wenn "setVisible(true)" blockiert.

Im Prinzip brauche ich genau dieses Verhalten auch für meine "playAnimation()" Methode. Diese soll aufgerufen werden und blockieren, d.h. erst zurückkehren, wenn die Animation fertig abgelaufen ist. Ich müsste dann aber auch selbst einen neuen Event-Dispatch-Thread aufmachen, damit die Event-Verarbeitung weiterhin funktioniert. Ich weiß nur leider nicht, wie das geht.

Hat jemand eine Idee, wie ich bei diesem Problem vorgehen könnte?

Über Hilfe würde ich mich sehr freuen.

Vielen Dank!
 

Marco13

Top Contributor
Hmjach, mit einem ganz ähnlichen Thema schlag' ich mich auch grad rum... das KANN ganz schön kompliziert sein.

Was mich ein bißchen irritiert hat: Dass du in der Animation ein Panel bewegen willst. DAS muss ja sowieso im Event-Dispatch-Thread gemacht werden. Interessant wäre dann noch, zu wissen, welcher Thread die openDialog-Methode aufruft - aber ich gehe mal davon aus, dass es auch der EDT ist.

Einen neuen EventPump aufzumachen ... hm ... ich hatte mir mal angesehen, was beim "show()" eines modalen Dialogs passiert :shock: das ist heftig! Und es werden Dinge verwendet, die zumindest package-private sind, d.h. man wird das nicht ohne weiters "nachbauen" können.

Wirklich dafür zu sorgen, dass alles andere blockiert, wie bei einem modalen Dialog, dürfte schwierig werden. Aber wenn es "nur" um die zeitliche Abfolge geht (d.h. die Animation läuft und blockiert NICHT, aber der Dialog geht trotzdem erst auf, wenn sie fertig ist) könnte man da bestimmt was basteln....
 

patb

Mitglied
Marco13 hat gesagt.:
Was mich ein bißchen irritiert hat: Dass du in der Animation ein Panel bewegen willst. DAS muss ja sowieso im Event-Dispatch-Thread gemacht werden. Interessant wäre dann noch, zu wissen, welcher Thread die openDialog-Methode aufruft - aber ich gehe mal davon aus, dass es auch der EDT ist.

Ja das ist richtig, es muss im EDT gemacht werden. Die openDialog Methode wird auch in einem EDT verwendet. Mein Beispiel oben läuft also komplett im EDT.


Marco13 hat gesagt.:
Einen neuen EventPump aufzumachen ... hm ... ich hatte mir mal angesehen, was beim "show()" eines modalen Dialogs passiert :shock: das ist heftig! Und es werden Dinge verwendet, die zumindest package-private sind, d.h. man wird das nicht ohne weiters "nachbauen" können.

Ja, ich habe mir das auch einmal angesehen. Und ich habe es nicht richtig verstanden, da werden ganz "low levelig" irgendwelche Events gefeuert (eventQueue.postEvent...) und so, da steigt man so leicht nicht durch.

Marco13 hat gesagt.:
Wirklich dafür zu sorgen, dass alles andere blockiert, wie bei einem modalen Dialog, dürfte schwierig werden. Aber wenn es "nur" um die zeitliche Abfolge geht (d.h. die Animation läuft und blockiert NICHT, aber der Dialog geht trotzdem erst auf, wenn sie fertig ist) könnte man da bestimmt was basteln....

Tja, ich habe natürlich versucht, mein Anliegen einfach zu formulieren. Aber es kommen noch andere Dinge hinzu, z.B. dass die showDialog Methode auch einen Rückgabewert hat (Enums die angeben, ob der Dialog abgebrochen wird etc..)
Ich habe die Sache schon auf die verschiedensten Arten und Weisen versucht zu lösen, mit einem SwingWorker, mit einem normalen Thread, mit Events die ausgelöst werden und danach dann den Dialog öffnen etc... aber es hat immer irgendwo gehakt, z.b. eben an diesem Rückgabewert. Vor allem der macht Probleme. Es gäbe auch die Möglichkeit, dem Dialog mitzuteilen, welche Methode er nach Beendigung aufrufen soll, z.B. mit Interfaces oder per Reflection, aber das ist alles so hammer "geflickt", absolut keine schöne Vorgehensweise und wenn ich das nicht genauestens dokumentiere, steige ich da selbst nach nem halben Jahr nicht mehr durch :)

Die Lösung, dass der Animationsaufruf so blockiert wie es setVisible tut, wäre die beste Lösung, aber wohl auch die schwierigste :-/

Aber eine andere gute Alternative fällt mir einfach nicht mehr ein.
 

Wildcard

Top Contributor
Bist du dir sicher das nicht zB ein einfacher JProgressMonitor genügt?
Das alles hört sich etwas abenteuerlich an.
 

patb

Mitglied
Wildcard hat gesagt.:
Bist du dir sicher das nicht zB ein einfacher JProgressMonitor genügt?
Das alles hört sich etwas abenteuerlich an.

Wie kann mir ein ProgressMonitor helfen? Dieser ist doch dafür da, ein Dialog zu öffnen, der den Fortschritt eines längeren Tasks anzeigt.

Mein Dialog hat damit aber nichts zu tun, bzw. das was mein Dialog anzeigt hat nichts mit irgendeiner Art von Fortschritt zu tun. Ich möchte nur, um es nochmal zu wiederholen, den Dialog erst öffnen (setVisible(true)), wenn die Animation zu Ende ist.

Falls das doch irgendwie mit ProgressMonitor möglich sein sollte, musst Du mir Deinen Vorschlag nochmal genauer erklären.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
M passende Reflexion-Methode?? AWT, Swing, JavaFX & SWT 1
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
M Swing Methode datenLesen() greift auf catchBlock zu? AWT, Swing, JavaFX & SWT 25
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
Z Methode bei Boolean change neu Ausführen AWT, Swing, JavaFX & SWT 9
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
A Methode pausieren bis anderes Ereignis ausgeführt AWT, Swing, JavaFX & SWT 2
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Brauche Erklärung von Methode AWT, Swing, JavaFX & SWT 1
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
I Methode Draw3DRect und DrawRect AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
K Methode repaint() AWT, Swing, JavaFX & SWT 1
A Methode in bestimmten Intervall ausführen AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
Q AWT Methodenaufruf aus actionPerformed-Methode AWT, Swing, JavaFX & SWT 4
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
T Swing Methode in Listener aufrufen AWT, Swing, JavaFX & SWT 3
P keyTyped-Methode AWT, Swing, JavaFX & SWT 1
D JavaFX Java Methoden mit JavaFX Methode kommunizieren lassen? AWT, Swing, JavaFX & SWT 3
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
F JavaFX Mit einer Methode auf Stage zugreifen. AWT, Swing, JavaFX & SWT 8
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
K Swing Durch Methode erzeugte Buttons ansteuern AWT, Swing, JavaFX & SWT 5
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S PaintIn - Methode AWT, Swing, JavaFX & SWT 1
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
D JavaFX Interface Initializable - Was machen die Parameter in der Methode inizializeable() ? AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
T Swing Label aus anderer Methode bearbeiten AWT, Swing, JavaFX & SWT 2
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
C Methode über Buttonklick starten AWT, Swing, JavaFX & SWT 8
S Swing Mit einem Link eine Methode aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Auf Methode zugreifen (am Schlauch steh) AWT, Swing, JavaFX & SWT 5
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
D Swing DefaultTableModel setValueAt Methode AWT, Swing, JavaFX & SWT 7
J valueChanged()-Methode liefert unbrauchbare Daten AWT, Swing, JavaFX & SWT 4
T Swing JPanel - "Open" Methode? AWT, Swing, JavaFX & SWT 6
P Swing actionPerformed()-Methode funktioniert nicht AWT, Swing, JavaFX & SWT 3
M Applet Bricht Methode zwischendruch ab AWT, Swing, JavaFX & SWT 11
K Per Textfield Methode ausführen AWT, Swing, JavaFX & SWT 6
J Swing JTable - nach Sortieren andere Methode aufrufen AWT, Swing, JavaFX & SWT 2
C Swing Was macht die Methode "setDataProviderCreditShown(boolean b)" AWT, Swing, JavaFX & SWT 4
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable's valueChanged Methode überschreiben AWT, Swing, JavaFX & SWT 2
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
N Methode zum Prüfen ob Jtextfield verändert worden ist AWT, Swing, JavaFX & SWT 2
K beim Schließen des JFrames, Methode aufrufen AWT, Swing, JavaFX & SWT 3
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
D Applet Methode in Timer einbinden AWT, Swing, JavaFX & SWT 6
Screen Fehler bei Get-Methode für ArrayList AWT, Swing, JavaFX & SWT 8
P Swing JPanel über Methode setzen AWT, Swing, JavaFX & SWT 2
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
T Swing setText()-Methode Funktioniert nicht AWT, Swing, JavaFX & SWT 7
L JLabel Methode setText funktioniert nicht AWT, Swing, JavaFX & SWT 5
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
S Visual Editor mit main Methode AWT, Swing, JavaFX & SWT 3
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
F Swing JFrame Methode beim Schließen aufrufen AWT, Swing, JavaFX & SWT 5
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
H applet Methode aus abstrakter Klasse aufrufen AWT, Swing, JavaFX & SWT 12
S Methode fireTableDataChanged() AWT, Swing, JavaFX & SWT 2
Y Swing Problem mit Main Methode AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
R Run Methode Probleme AWT, Swing, JavaFX & SWT 2
B Methode setzt nicht das Layout in einer if-Abfrage AWT, Swing, JavaFX & SWT 13

Ähnliche Java Themen


Oben