# JLabel nach 5 Sekunden wieder leeren



## FranzFerdinand (14. Nov 2014)

Hallöle,

ich hab da mal ne Frage zu den JLabels. Ich hab ein nettes Textfeld eingerichtet, wo man Dinge eingeben kann und er dann je nach Inhalt eine Meldung in JLabelMeldung ausgibt.
Die Meldung soll nach 5 Sekunden wieder verschwinden.
Ich habe das bisher so gelöst:

```
jLabelMeldung.setText("Deine Eingabe war inkorrekt!");
		Thread.sleep(5000);
		jLabelMeldung.setText("");
```

Diese Variante ist aber schon etwas arm. Zumal Thread.sleep ja auch das ganze Fenster einfriert. Er soll nur einfach im Hintergrund 5 Sekunden zählen und dann den Befehl zum leeren ausführen.

Hat da jemand eine Idee dazu?


Herzlichsten Dank!

Schöne Grüße
Lukas


----------



## JCODA (14. Nov 2014)

```
jLabelMeldung.setText("Deine Eingabe war inkorrekt!");
		new Timer(5000, new ActionListener(){
public void actionPerformed(ActionEvent ae){
jLabelMeldung.setText("");
}

}).start();
```


so ?
EDIT: hierfür muss jLabelMeldung final sein.


----------



## Androbin (15. Nov 2014)

JCODA hat gesagt.:


> ```
> jLabelMeldung.setText( "Deine Eingabe war inkorrekt!" );
> new Timer( 5000, new ActionListener() {
> public void actionPerformed( ActionEvent e ) {
> ...


Gute Idee! Aber warum muss es denn final sein?


----------



## JCODA (15. Nov 2014)

Androbin hat gesagt.:


> Gute Idee! Aber warum muss es denn final sein?





> Lokale und innere Klassen können auf die lokalen Variablen beziehungsweise Parameter der umschließenden Methode lesend zugreifen, jedoch nur dann, wenn die Variable final ist.


siehe Hier


----------



## FranzFerdinand (15. Nov 2014)

Hallöle,

danke schön. Nachdem ich entsprechend den Timer und Action Event importiert habe, ging das ganze perfekt, danke!
Aber meine Frage bleibt auch, wieso das Final sein muss?
Es geht bei mir nämlich auch ohne.

Oder meinst Du möglicherweise, dass es ohne geht, aber ohne Final eventuell Probleme machen könnte?

Mein JLabelMeldung ist in der Hauptklasse protected static.

Gruß
Lukas


----------



## JCODA (15. Nov 2014)

Okay, jetzt hab ich auch wieder 'was dazugelernt: 

Früher mussten lokale Variablen, die in einem anonymen Objekt benutzt werden sollten final sein. Jetzt meckert mein Eclipse erst, wenn man tatsächlich die Variable erneut zuweisen möchte. Siehe: 


```
import java.awt.event.*;
import javax.swing.Timer;

public class FinalTest {
	public FinalTest(){		
		String hi = "hallo";
		new Timer(1000,new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent ae) {
				hi = "blub";				
			}			
		});		
	}
}
```

Mit dem Kommentar: _Local variable hi defined in an enclosing scope must be final or effectively final._

Ich habe gerade danach gesucht, und gesehen, dass das eine Änderung mit Java8 ist: 



> However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. *A variable or parameter whose value is never changed after it is initialized is effectively final.*



Siehe hierzu: java - Difference between final and effectively final - Stack Overflow

Würde man hi als Instanzvariable deklarieren funktioniert es natürlich.


----------



## JavaDude (17. Nov 2014)

Man könnte das Ganze durchaus per Thread lösen, auch ohne das das ganze Fenster einfriert. Dafür darfst du die Methode nur nicht statisch aufrufen, sondern musst einen neuen Thread mit eigener Run-Methode starten, der 5 Sekunden "schläft" und dann den Text zurücksetzt. Ich sehe nicht, was daran arm sein sollte ^^
Wenn du's ganz kompliziert haben möchtest, kannst du auch eine eigene Klasse schreiben, die eine Methode besitzt, der ein JLabel übergeben wird, dessen Text zurückgesetzt werden soll. Dann könntest du den Thread/Timer auch da abarbeiten lassen.


----------



## FranzFerdinand (20. Nov 2014)

Hallöle,

ich habe es nun so gelöst:

```
public static void eingabeinkorrekt(int timerzeit) {
		jLabelMeldung.setText("Deine Eingabe war inkorrekt!");
		new Timer(timerzeit, new ActionListener() {
		public void actionPerformed(ActionEvent e) {
		jLabelMeldung.setText("");
		} } ).start();
	}
```

Und bei Bedarf rufe ich es beispielsweise für 5 Sekunden hiermit auf:

```
eingabeinkorrekt(5000);
```

Das funktioniert auch teilweise sehr gut. Aber immer nur am Anfang.
Bei den ersten 2-3 Versuchen klappt das immer mit 5 Sekunden.
Aber wenn ich das danach immer mal mache, dann kommt es manchmal gar nicht, manchmal nach 2 Sekunden, oder auch 7, und des öfteren verschwindet es gar nicht mehr.

Das scheint also irgendwie noch Fehlerbehaftet zu sein.

Mögliche Ideen, wieso das so sein kann?

Gruß
Lukas


----------

