2017-10-15 7 views
0

私は、1秒間隔でラベルの表示を偽にする予定のプログラムを作成しています。 プログラムは非常に長く、複雑ですので説明しています。私はラベルの配列を持っていて、ラベルがsetVisible(false)であるたびに、slp()メソッドが実行されます。NetBeans

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

しかし、私は問題に直面しています。メソッドはスレッドの実行時間を増加させ、すべてのラベルは最後に一緒に見えなくなります。私はアニメーション効果が必要です、そして、それは来ていません。 私の問題にはどのような良い解決策がありますか?タイマーで私を務めることはできますか?

+0

次の作業を行う必要があり新しいスレッドで1秒の待機を実行します。 – cello

+0

は、私はそれをどのように行うかを教えていただけますか? –

答えて

0

最初に、slpのメソッドは、おそらくJLabelを引数とする必要があります。そのため、特定のラベルの表示を変更できます。それ以外の場合は、どのラベルを非表示にするかはわかりません。

第2に、メインスレッド(またはそのクラスのスレッドslp())をブロックしないように、Thread.sleep(1000)は独自のスレッドで実行する必要があります。以下のコードは、実際の作業を行います新しいスレッドを作成するnew Thread(....).start();を使用する理由です。

第3に、待機中のスレッドが別のスレッドにあるため、ラベルの可視性を変更することは、Swing Eventsスレッドで再度実行する必要があります。このために、我々は、ラベルの可視性を設定しSwingUtilities.invokeLater()を使用しています。すべて一緒に

、コードは次のようになります。

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(); 
} 

コードは、Java 8以降で利用可能とラムダ式を使用して「クリーンアップ」、さらに次のようになります。

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

これは機能しません。最初のコードを使用しましたが、ラベルをパラメータとして使用しませんでした。それはグローバルなので私は直接それを参照しました。しかし、今はslp()にも入っていないかのようです。 –

+0

上記のコードは、1秒後にラベルを非表示にします。それがあなたのために働いていない場合は、あなたのコードで何か間違っているはずです。推測の代わりにあなたを助けることができるように、[mcve]を投稿してください。 – cello