# GUI für kurze Zeit stillstehen lassen.



## Gast (20. Jan 2008)

Hallo,

ich will meine GUI kurze Zeit stillstehen lassen. Dazu nachstehender Code:


```
if (arg1.equals("xxx")){
     fehler.setText("Daten wurde erfolgreich hinzugefügt");
     validate();                                            <----------------- Funktioniert net
				
	try {
	     Thread.sleep(1500);
	     } catch (InterruptedException e) {
		//nichts
	     }
	       fehler.setText("");
		informObserver("Suche", null);
	     }
```

Mein Problem liegt darin, dass das Label fehler nicht angezeigt wird. 
Die Gui wird einfach für ca. 1,5 sec eingefroren. Es sollte aber im Vorwege dieser Satz gezeigt werden.

 fehler.setText("Daten wurde erfolgreich hinzugefügt");
     validate();                                            

Leider wird nichts nicht angezeigt.

Wo liegt mein Fehler ?  Ich hoffe, es ist deutlich geworden, was mein Problem ist...

Grüße


----------



## André Uhres (21. Jan 2008)

Damit sich die beiden GUI Operation nicht in die Quere kommen,
müssen wir den sleep und den zweiten setText über SwingUtilities.invokeLater aufrufen
(den ersten setText auch, wenn er ein JLabel verändern soll und wir nicht auf dem EDT sind).

```
SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //setText
            }
        });
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //sleep + setText
            }
        });
```


----------



## Gast (21. Jan 2008)

Hallo André ,

danke Dir .  Werde es gleich mal probieren


----------



## Gast (21. Jan 2008)

Wenn ich nun die GUI / Main Funktion mit selbiger Funktion starte. Ist es dann so, dass das Programm 
in 2 Threads abläuft ? 

Man sieht es ja auch immer bei den Java Tutorials von SUN , dass die Programme
mit der Funktion  SwingUtilities.invokeLater(new Runnable()  gestartet werden.

Das wäre mal sehr wichtig für mein Verständnis .


----------



## André Uhres (21. Jan 2008)

Gast hat gesagt.:
			
		

> Wenn ich nun die GUI / Main Funktion mit selbiger Funktion starte. Ist es dann so, dass das Programm
> in 2 Threads abläuft ?


SwingUtilities.invokeLater schickt den Code auf den EDT ("Event Dispatch Thread")
wo ein Event nach dem anderen verarbeitet wird (also nie zwei Sachen gleichzeitig).
Eine GUI sollte immer auf dem EDT gestartet werden. Danach stirbt der "Initial Thread" 
und das Programm läuft nur noch auf dem EDT. Du kannst natürlich zusätzlich noch 
einen oder mehrere "Worker Threads" starten (auch "Background Threads" genannt).
Aber alles, was die GUI aktualisiert, sollte auf dem EDT laufen.
Nur einige wenige Swing Methoden sind threadsafe und können demnach auch direkt in einem
"Worker Thread" aufgerufen werden, wie z.B. JTextComponent#setText.


----------



## Gast (21. Jan 2008)

das ist druckreif. Danke


----------



## Wildcard (21. Jan 2008)

> ```
> SwingUtilities.invokeLater(new Runnable() {
> public void run() {
> //sleep + setText
> ...


Den EDT legt man *nicht* schlafen! Auch nicht für 1,5 Sekunden!


----------



## André Uhres (21. Jan 2008)

> Den EDT legt man nicht schlafen


Richtig, Ausnahmen bestätigen die Regel.


----------



## Wildcard (21. Jan 2008)

Welche Ausnahme soll das sein?
Dieser Use-Case ist sicherlich keine Ausnahme.


----------



## André Uhres (21. Jan 2008)

Wildcard hat gesagt.:
			
		

> Welche Ausnahme soll das sein?
> Dieser Use-Case ist sicherlich keine Ausnahme.


Aber ganz sicher ist das eine. Ist sehr eindeutig definiert. Noch klarer kann man's keinem machen.


----------



## Wildcard (21. Jan 2008)

Nein, es ist keine Ausnahme. Welchen Grund siehst du hier den EDT Schlafen zu legen.
Nur weil der OP meint dies tun zu müssen, ist es noch lange nicht die korrekte Lösung.


----------



## André Uhres (21. Jan 2008)

Wildcard hat gesagt.:
			
		

> Nein, es ist keine Ausnahme. Welchen Grund siehst du hier den EDT Schlafen zu legen.
> Nur weil der OP meint dies tun zu müssen, ist es noch lange nicht die korrekte Lösung.


Das sagst du. Nur weil du immer alles besser wissen willst, ist unserer Lösung noch lange nicht verkehrt


----------



## Wildcard (21. Jan 2008)

Dich stört als Anwender also nicht wenn eine Applikation plötzlich stillsteht, sich nicht neu zeichnet und keine Events mehr verarbeitet. Interessant.


----------



## André Uhres (21. Jan 2008)

Wildcard hat gesagt.:
			
		

> Dich stört als Anwender also nicht wenn eine Applikation plötzlich stillsteht,
> sich nicht neu zeichnet und keine Events mehr verarbeitet. Interessant.


Wie gesagt, ist dies eine Ausnahme, hier stört's niemanden.


----------



## Wildcard (21. Jan 2008)

André Uhres hat gesagt.:
			
		

> Wie gesagt, ist dies eine Ausnahme, hier stört's niemanden.


Hast du Informationen die mir nicht zur Verfügung stehen? Sind du und der OP die einzigen Nutzer?
Du hast doch sicherlich schon gemerkt das häufig die Antwort auf eine Frage nicht immer die Lösung des Problems ist.
Wenn es dem OP hier egal ist, soll's mir recht sein, aber ich finde man kann zumindest darauf hinweisen, dass es übelster Foobar ist.


----------



## André Uhres (21. Jan 2008)

Wildcard hat gesagt.:
			
		

> André Uhres hat gesagt.:
> 
> 
> 
> ...


Ich glaub , du stehst auf dem Schlauch, oder du hast den Thread falsch verstanden.


----------



## Wildcard (21. Jan 2008)

Der OP schreibt dazu nur: 





> ich will meine GUI kurze Zeit stillstehen lassen.


Vermutlich möchte er das keine Benutzerinteraktion möglich ist, denn mir fällt kein Grund ein warum die GUI einfrieren soll und er/sie war einfach der Meinung, er/sie müsse dazu den EDT schlafen legen.
Daher gebe ich zu bedenken, dass es IMO nie eine gute Idee ist den EDT schlafen zu legen (wenn du mir ein gegenteiliges Beispiel nennen kannst, bitte sehr).
Wie bereits erwähnt, ich bin der Meinung, dass die Antwort auf eine Frage, nicht immer die richtige Lösung für das Problem ist, und diesen Fall vermute ich auch hier.


----------



## André Uhres (22. Jan 2008)

Wildcard hat gesagt.:
			
		

> ..die richtige Lösung..


In diesem Thread wurde bislang nur eine Lösung gegeben. Die Qual der Wahl hat man damit jedenfalls nicht :wink:


----------



## Wildcard (22. Jan 2008)

Weil nicht wirklich auf die Ursache des Problems eingegangen wurde, sondern nur ein Symptom beschrieben wurde, die 'Lösung' bereits feststand und nur nach der Umsetzung gefragt wurde.


----------



## André Uhres (22. Jan 2008)

Seit der einzigen Lösung wird nur unkonstruktiv theoretisiert weil's wohl keiner besser machen kann.


----------



## Gast (22. Jan 2008)

Moin,

war mir eigentlich sicher, dass es funktionieren würde.
Tut es aber nicht. 

Es geht so nicht:


```
SwingUtilities.invokeLater(new Runnable() { 
            public void run() { 
                //setText 
            } 
        }); 
        SwingUtilities.invokeLater(new Runnable() { 
            public void run() { 
                //sleep + setText 
            } 
        });
```


Das sleep wird ausgeführt.  setText() jedoch leider nicht !


Woran könnte das wohl liegen ?


----------



## Gast2 (22. Jan 2008)

musstest du dein textfield auf final setzen????


----------



## André Uhres (22. Jan 2008)

http://www.java-forum.org/de/userfiles/user3690/Demo.jar
Quälcode im jar  :bae:


----------



## Gast (22. Jan 2008)

Echt Mega.

Rennt wie ne 1.    Tausend Dank .  Wäre ich so nicht drauf gekommen...


----------

