2017-10-15 4 views
0

Ich mache ein Programm, in dem ich die Sichtbarkeit der Etiketten falsch machen soll, sagen wir, 1 Sek. Intervalle Das Programm ist ziemlich lang und komplex zu zitieren, also erkläre ich es. Ich habe ein Array von Labels und jedes Mal, wenn ein Label gesetzt istVisible (false), wird slp() -Methode ausgeführt.Machen Sie Etiketten nach einiger Zeit unsichtbar NetBeans

public void slp() 
{ 
    try{ 
     Thread.sleep(1000); 
    } 
    catch(Exception e) 
      { 
       System.out.println(e); 
      } 
} 

Aber ich stehe vor einem Problem. Die Methode erhöht nur die Ausführungszeit des Threads und alle Labels werden zusammen unsichtbar. Ich brauche Animationseffekt, und das kommt nicht. Was wäre eine gute Lösung für mein Problem? Kann mir ein Timer dienen?

+0

Sie müssen Führe die Wartezeit von 1 Sekunde in einem neuen Thread aus. – cello

+0

Können Sie mir bitte sagen, wie mache ich das? –

Antwort

0

Zuerst Ihre Methode slp sollte wahrscheinlich ein JLabel als Argument nehmen, so können Sie die Sichtbarkeit von einem bestimmten Label ändern. Andernfalls würde die Methode nicht wissen, welches Label ausgeblendet werden soll.

Zweitens, um den Haupt-Thread (oder was auch immer Thread dieser Klasse slp()) nicht zu blockieren, sollte die Thread.sleep(1000) in einem eigenen Thread ausgeführt werden. Deshalb verwendet der folgende Code new Thread(....).start();, um einen neuen Thread zu erstellen, der die eigentliche Arbeit erledigt.

Drittens, da das Warten jetzt in einem separaten Thread ist, muss die Sichtbarkeit der Labels im Thread Swing Events erneut geändert werden. Dazu verwenden wir SwingUtilities.invokeLater(), wo wir dann die Sichtbarkeit des Labels festlegen.

Alle zusammen, der Code wie folgt aussehen könnte:

public void slp(JLabel label) { 
    new Thread(new Runnable() { 
     public void run() { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        label.setVisible(false); 
       } 
      }); 
     } 
    }).start(); 
} 

Der Code könnte weiter "bereinigt" werden, indem da Java Lambda-Ausdrücke wie erhältlich unter Verwendung von 8:

public void slp(JLabel label) { 
    new Thread(() -> { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     SwingUtilities.invokeLater(() -> label.setVisible(false)); 
    }).start(); 
} 
+0

Es funktioniert nicht. Ich habe den ersten Code verwendet, außer dass ich das Label nicht als Parameter genommen habe. Es war global, also habe ich direkt darauf Bezug genommen. Aber jetzt scheint es, als ob es nicht einmal slp() eingegeben hätte. –

+0

Der obige Code wird ein Etikett nach 1 Sekunde ausblenden. Wenn es nicht für Sie funktioniert, muss etwas anderes in Ihrem Code falsch sein. Bitte poste ein [mcve], damit wir dir helfen können, anstatt zu raten. – cello