# SwingUtilities.invokeLater und Modaler JDialog



## Dit_ (25. Mrz 2011)

Hallo,

Dass man die Gui-Komponente in einem EDT starten/manipulieren soll, haben wir schon X-mal angesprochen... aber:

```
//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!


----------



## diggaa1984 (25. Mrz 2011)

was genau ist das problem!? durch welche aktion wird der dialog aufgerufen (buttonklick oder ähnliches)?


----------



## Dit_ (25. Mrz 2011)

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


```
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 
	
	
	
	





```
showAndGet()
```
 gibt UserInput-Objekt zurueck, aber halt nur dann wenn 
	
	
	
	





```
setVisible(false)
```
 aufgerufen wird. 


```
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:


----------



## diggaa1984 (25. Mrz 2011)

na der sinn eines modalen dialogs ist es doch, die gui zu blockieren, bis der dialog weg ist!


----------



## Marco13 (25. Mrz 2011)

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  )


----------



## GladstoneGander (25. Mrz 2011)

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?


----------



## Dit_ (25. Mrz 2011)

Schön und gut aber ich muss doch etwas mit der Eingabe noch machen...


```
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?


----------



## tfa (25. Mrz 2011)

> Oder soll ich die komplette funktionalität im EDT implementieren?


Das kommt ganz drauf an, was diese Funktionalität macht. Dauert es z.B. nur ein paar Millisekunden oder wird minutenlang rumgerechnet?


----------



## Dit_ (25. Mrz 2011)

tfa hat gesagt.:


> Das kommt ganz drauf an, was diese Funktionalität macht. Dauert es z.B. nur ein paar Millisekunden oder wird minutenlang rumgerechnet?



ich glaube SwingWorker wäre hier besser, oder ?


----------



## Michael... (25. Mrz 2011)

Dit_ hat gesagt.:


> ich glaube SwingWorker wäre hier besser, oder ?


Für welchen Zweck? Es soll doch nur ein Dialog geöffnet werden und gewartet werden bis dieser geschlossen wird?!


----------



## Dit_ (25. Mrz 2011)

Dialog liefert ein Input-Objekt. dieses wird dann ausgewertet und in der DatenBank abgelegt.


----------



## Marco13 (25. Mrz 2011)

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.


----------

