SwingUtilities.invokeLater und Modaler JDialog

Dit_

Bekanntes Mitglied
Hallo,

Dass man die Gui-Komponente in einem EDT starten/manipulieren soll, haben wir schon X-mal angesprochen... aber:
Java:
//modaler Dialog
InputJDialog dialog = new InputJDialog();
UserInput input = dialog.showAndGet();
if(input == null){
    return;//benutzer bricht die Eingabe ab.
}

//...

was macht man in dem Fall? :rtfm:

Danke schon mal!
 
Zuletzt bearbeitet:
😱

Problem liegt wahrscheinlich darin, dass man sowas nicht machen kann:

Java:
                SwingUtilities.invokeLater(new Runnable() {
					
					@Override
					public void run() {
						//modaler Dialog
						InputJDialog dialog = new InputJDialog();
						UserInput input = dialog.showAndGet();
						if(input == null){
						    return;//benutzer bricht die Eingabe ab.
						}
						    //....
					}
				});

Modales Dialog Fenster:

die Methode
Code:
showAndGet()
gibt UserInput-Objekt zurueck, aber halt nur dann wenn
Code:
setVisible(false)
aufgerufen wird.

Code:
setVisible(false)
wird aufgerufen wenn der User seine Eingabe gemacht und auf OK geklickt hat.

Solange der User eine Eingabe macht, wird EDT blockiert :bahnhof:
 
Vielleicht geht es darum, dass der Dialog den EDT ""blockiert"", der EDT aber nicht wirklich "blockiert" werden soll? Bei einem modalen Dialog laufen im Hintergrund viele magische Dinge ab. Insbesondere wird FÜR den Dialog quasi ein neuer EDT gestartet, und nur der "alte" EDT wird blockiert. (Andernfalls könnte ja z.B. der Hintergrund nicht neu gezeichnet werden, wenn man den Dialog bewegt - genaugenommen könnte nichtmal der Dialog selbst gezeichnet werden 😀 )
 
JavaDoc lesen:

Dialog (Java Platform SE 7 b133))

Für die Faulen:

(...)
"It is OK to call this method from the event dispatching thread because the toolkit ensures that other events are not blocked while this method is blocked."

Hast du denn irgendein Problem in deiner Anwendung deswegen oder war das nur eine Frage der Frage wegen?
 
Schön und gut aber ich muss doch etwas mit der Eingabe noch machen...

Java:
                UserInput input = null;
                SwingUtilities.invokeLater(new Runnable() {
                    
                    @Override
                    public void run() {
                        //modaler Dialog
                        InputJDialog dialog = new InputJDialog();
                        input = dialog.showAndGet();
                       
                            //....
                    }
                });

                if(input == null){
                        //KOMMT HALT HIER IMMER REIN...
                        return;
                } else {
                        auswerte(input);
                }

Oder soll ich die komplette funktionalität im EDT implementieren?
 
Dann solltest du, nachdem der Dialog zu ist, das Objekt abholen, aber das Abspeichern (was ja vermutlich aufwändiger sein kann) dann von einem eigenen Thread machen lassen. DAfür kannst du dann einen SwingWorker verwenden.
 

Neue Themen


Zurück
Oben