# JLabel hochzählen lassen.



## Artischoche (13. Jan 2015)

Hallo,
ich möchte mein JLabel hochzählen lassen. dafür hab ich natürlich eine for-schleife genommen.
allerdings rechnet der pc so schnell, dass das endergebniss sofort darsteht.
ich habe es mit wait() probiert aber da kam nur eine FehlerMeldung.
mit Thread.sleep(milliSeconds) gibt mir das JLabel gar nichts aus bis die zeit abgelaufen ist und gibt dann wieder das energebniss aus. die for schleife läuft also im Hintergrund weiter. 
wie? 

```
if(e.getSource()==jb1){
		for(int i=0;i<20;i++){
			try {
				Thread.sleep(100);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			String a=Integer.toString(i);
			lb.setText(a);
		}
	}
```
weiß jemand von euch wie auch die vor schleife pausiert?

Viele Grüße

Jakob


----------



## Gucky (13. Jan 2015)

Du musst das Ganze in einen anderen Thread auslagern. Momentan blockierst du den GUI Thread, weshalb nichts neu gezeichnet werden kann.
Nur mit sleep() erreichst du keine große Genauigkeit. Wenn dir das egal ist, kannst du sleep ruhig nehmen aber sonst wäre eine Kombination aus sleep und der Systemzeit besser.


----------



## Java20134 (14. Jan 2015)

Ich würde einfach die Zahl vor dem Thread.sleep(100); einfügen. Dabei müsstest du die Zahl 100 vllt. erhöhen. Du kannst aber auch mit System.currentTimeMillis(); oder System.nanoTime(); arbeiten. Dabei würde ich die for in eine while Schleife umschreiben. Wenn die Differenz zwischen der Anfangszeit und der Zeit in der whileSlcheife größer x ist, dann gebe dem JLabel einen neuen Wert. Danach musst du denn Wert noch um 1 addieren.

```
int x = 0; 
start = System.currentTimeMillis();
while(true){
  ende = System.currentTimeMillis()-start;
  if(ende > 5){
    JLabel.setText(Integer.parseInteger(x));
    x++; 
    start = System.currentTimeMillis(); 
  }
}
```


----------



## Joose (14. Jan 2015)

Java20134 hat gesagt.:


> Ich würde einfach die Zahl vor dem Thread.sleep(100); einfügen. Dabei müsstest du die Zahl 100 vllt. erhöhen. Du kannst aber auch mit System.currentTimeMillis(); oder System.nanoTime(); arbeiten. Dabei würde ich die for in eine while Schleife umschreiben. Wenn die Differenz zwischen der Anfangszeit und der Zeit in der whileSlcheife größer x ist, dann gebe dem JLabel einen neuen Wert. Danach musst du denn Wert noch um 1 addieren.



Das wird sein Problem nicht lösen. Einerseits läuft dein Code endlos, er will nur hochzählen (daher auch die for statt der while Schleife)
Und du hast das selbe Problem wie der TO: Die Ausführung der while-Schleife blockiert den EDT welcher für das Neuzeichnen des JLabels zuständig ist.

Bei sowas muss man immer mit einem 2ten Thread arbeiten.

Anmerkung zum Code: Vermeide while Schleifen ohne richtige Abbruchbedingung!

```
// Schlechte Wahl
while(true) {
......
}

// Bessere Wahl
boolean isRunning = true;
while(isRunning){
......
}
```


----------



## Java20134 (14. Jan 2015)

Man kann ja einfach noch eine if Schliefe in die andere if Schleife einbinden und überprüfen, ob der x-Wert größer oder gleich einen anderen Wert ist und dann springst du einfach aus der while Schleife mit break; 
Und dann ist meine Methode genauso effektiv und ändert sich von deiner halt nur von dem boolean.


----------



## Joose (14. Jan 2015)

Java20134 hat gesagt.:


> Man kann ja einfach noch eine if Schliefe in die andere if Schleife einbinden



if-schleife.de



Java20134 hat gesagt.:


> und überprüfen, ob der x-Wert größer oder gleich einen anderen Wert ist und dann springst du einfach aus der while Schleife mit break;
> Und dann ist meine Methode genauso effektiv und ändert sich von deiner halt nur von dem boolean.



Ja und hier liegt der Schönheitsfehler/Denkfehler ... warum brauch ich eine extra if-Bedingung um die while-Schleife zu beenden, wenn ich die gleiche Überprüfung als while-Bedingung eintragen könnte?
Außerdem kann man deine Art der Schleife "nicht sauber" von außen beenden.


```
while(true) {
   if(!isRunning) {
      break;
   }   
}
-----------------------
boolean isRunning = true;
while(isRunning) {
}
```


----------



## Java20134 (14. Jan 2015)

Doch man kann die while Schleife sauber von außen beenden, indem man den x-Wert einfach erhöht. Und den Ausdruck kann man in die while Schleife schreiben, dass stimmt und macht das Programm auch schöner


----------

