# JLabel nach Zeit X ausblenden



## endnic (21. Sep 2009)

Hallo,

habe da ein kleines Problem...
Ich habe ein kleinen Login-Dialog geschrieben.
Falls der User falsche Login-Daten eingibt...erscheint ein JLabel mit der jeweiligen Fehlermeldung.

Nun möchte ich aber das das JLabel nach dem Erscheinen für eine bestimmte Zeit zu sehen ist und dann wieder autom. verschwindet.
Hat da jmd. eine Idee wie man das realisieren kann?

Danke


----------



## KrokoDiehl (21. Sep 2009)

Klingt verdammt nach Timer 
Im entspr. _TimerTisk _dann 
	
	
	
	





```
setVisible(false)
```
 aufrufen.


----------



## endnic (21. Sep 2009)

mmmhh... danke erstmal...aber so richtig schlau werd ich daraus nich....

habe erstmal das Object Timer erstellt...und nu ???:L


----------



## KrokoDiehl (21. Sep 2009)

Also hier mal ein kleines Beispiel:

```
public class Test
{
    class Ausblender extends TimerTask
    {
        @Override
        public void run()
        {
            myLabel.setVisible(true);
        }
    }

    protected JLabel myLabel = null;
    
    public Test()
    {
        // hier irgendwie GUI initialisieren
        
        myLabel = new JLabel("Klick mich, wenn du schnell genug bist!");
        Timer timer = new Timer();
        timer.schedule(new Ausblender(), 1000); //reagiert nach 1 Sek.
        
    }
}
```

Das ist das Wesentliche, was du brauchst: Sprich einen _TimerTask_, wo du implementierst was nach Ablauf des Timers geschehen soll, und den _Timer _selbst, dem du den Task angibst.


----------



## ARadauer (21. Sep 2009)

```
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JLabel;


public class TestHide extends JFrame {

   JLabel label;

   public static void main(String[] args) {
      final TestHide frame = new TestHide();
      frame.setSize(200,200);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.init();
      frame.setVisible(true);



      Timer t = new Timer();
      t.schedule(new TimerTask() {
         @Override
         public void run() {
            frame.hideLabel();

         }
      }, 5000);

   }

   public void init(){
      label = new JLabel("Test");
      this.getContentPane().add(label);
   }

   public void hideLabel(){     
      label.setVisible(false);
      this.invalidate();
      this.repaint();

   }

}
```
zb...


----------



## RxSchuster (21. Sep 2009)

Es geht auch etwas einfachen mit einem Thread:


```
new Runnable() {
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                Label.setVisible(Flalse);
                
            }
        }.run();
```


----------



## Gast2 (21. Sep 2009)

RxSchuster hat gesagt.:


> Es geht auch etwas einfachen mit einem Thread:
> 
> 
> ```
> ...



nöö dann musst noch richtig zum, EDT synchronisieren... Deshalb ist der Timer vorzuziehen...


----------



## RxSchuster (21. Sep 2009)

SirWayne hat gesagt.:


> nöö dann musst noch richtig zum, EDT synchronisieren... Deshalb ist der Timer vorzuziehen...



Klär mich bitte auf. Wieso wird eine Synchronisation erforderlich?


----------



## Illuvatar (21. Sep 2009)

Änderungen an der GUI sollte man immer aus dem EDT heraus starten, sonst kann das zu unvorhergesehenen Ergebnissen führen. Wenn man keinen Timer verwendet, kann man mit folgenden Methoden einen Codeblock aus dem EDT aufrufen lassen:

SwingUtilities (Java Platform SE 6)
SwingUtilities (Java Platform SE 6)


----------



## RxSchuster (21. Sep 2009)

Ich war bislang der Meinung, dass das bei Threadsicheren Funktionen (wie setVisible) nicht erforderlich ist. Ich lasst mich aber gern eines besseren belehren.


----------



## Gast2 (21. Sep 2009)

wie kommst du darauf dass setVisible threadsafe ist??? Also darauf würde ich mich nicht verlassen. Außerdem sollte man danach noch ein repaint und revaldiate aufrufen, welche wieder Änderungen an der GUI vornehmen, also wieder im EDT ausgeführt werden müssen.


----------



## RxSchuster (22. Sep 2009)

Richtig, in einer Swing Komponente ist setVisible nicht Thread sicher. (In AWT schon). Wenn ich also mehr als einen Thread habe, der auf die Komponente zugreift, dann sollte ich mit invokeLater arbeiten. In dem obigen Beispiel ist es jedoch recht unwahrscheinlich, das von mehr als einem Thread gleichzeitig die GUI geändert wird.


----------



## endnic (22. Sep 2009)

cool danke euch...funktioniert gut...


----------

