# In For Schleife Label aktualisieren



## Horusab (17. Juni 2005)

Hi @ll

Wie kann man innerhalb einer for Schleife den Wert eines JLabel aktualisieren?

JLabel.setText(); 
funktioniert nicht, irgend wie muss ein Interrupt her, damit er den Befehl ausführt.
Er zeigt immer nur den Letzten Wert an, den ihm in der Schleife zugewiesen wurde. 


```
for(int i=0; i<5;i++) {
//Text ..
label.setText("test Text"+i); //Label verändert sich nicht.
System.out.println(label.getText()); //Ausgabe: "test Text"+i (z.B. test Text1)
//Text ..
}
//label nach abschluss: test Text4
```

Hat jemand Ideen?

mfg
horusab


----------



## MeinerEiner_80 (17. Juni 2005)

die setText() methode funktioniert schon.. wenn du die Ausgabe betrachtest, sieht man das ja...

Ich verstehe allerdings eh nicht, wieso du den Wert EINES Labels in einer Schleife ändern willst?
Die Schleife läuft doch so schnell durch, das man von den Änderungen doch eh nichts sieht.. da kann man doch gleich den Text auf den letzten Schleifen wert setzten?

Wenn du willst, das zwischen den Textänderungen ein gewisses Zeitintervall liegt,
probiers mal mit "Thread.sleep(Time)" .. das blockiert dir dann aber das System..
oder du benutzt eine Timer Instanz um den Text zu ändern... 


*grüssle*
Jörg


----------



## Horusab (17. Juni 2005)

MeinerEiner_80 hat gesagt.:
			
		

> die setText() methode funktioniert schon.. wenn du die Ausgabe betrachtest, sieht man das ja...



Hab nie das Gegenteil behauptet 



			
				MeinerEiner_80 hat gesagt.:
			
		

> Ich verstehe allerdings eh nicht, wieso du den Wert EINES Labels in einer Schleife ändern willst?
> Die Schleife läuft doch so schnell durch, das man von den Änderungen doch eh nichts sieht.. da kann man doch gleich den Text auf den letzten Schleifen wert setzten?



Das war ein Beispiel.
Es sollte veranschaulichen was ich damit meine.
Innerhalb der FOR Schleife wird selbstverständlich "heavy code" ausgeführt 
Dies ist z.B. bei einer Status-Anzeige sehr sinnvoll, damit der User merkt, dass das Programm (noch?) nicht abgestürzt ist.

Danke für deine Antwort
mfg
Horusab


----------



## Horusab (17. Juni 2005)

Ich habs herausgefunden:


```
label.setText(Text);
label.paintImmediately(label.getVisibleRect());
```

Ich hoffe ich konnte anderen die müsahme Sucherei ersparen 

Gruss
horusab


----------



## Levin Beicht (17. Juni 2005)

Hallo,

das Problem daran ist einfach, dass die Ausführung deines Codes nicht lang genug braucht um jeweils einzeln neu gezeichnet zu werden.
Wenn der Benutzer nur sehen soll das etwas passiert benutze doch eine ProgressBar, die nimmt dir das Problem ab.

Außerdem sollte man in Swing Anwendungen niemals rechenaufwändige Sachen im eventDispatch-Thread machen, sondern sie immer in einen eigenen Thread schieben, da sonst (sollte die Ausführung wirklich mal lange dauern, so im Rahmen von 5+ Sekunden) die Anwendung einfach komplett hängt. Aus diesem Thread kannst du dann mittels invokeLater() auch das Label/Progressbar aktualisieren und zu einem repaint bewegen.

Gruß Levin


----------

