2016-04-04 28 views
0

こんにちは皆、私のJLabelにwhileループを使用している私の変数 "counter"のすべての値を表示するためにJavaネットビーンでタイマーを使用できないかどうか尋ねたいと思います。ここに私のサンプルコードです。タイマを使用しない可能性があります

int counter = 0; 

while (counter < 10) { 
    lblDisplay.setText("Completed " + Integer.toString(counter)); 
    try { 
     Thread.sleep(1000); 
     lblDisplay.setText("Completed " + Integer.toString(counter)); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    counter++; 
} 

system.out.printlnの使用では表示されましたが、私のラベルには表示されませんでした。

+2

実際の質問はなぜですか?あなたのアプローチは、「タイマー」をスイングした方がよいでしょうか? – MadProgrammer

+0

編集の回答をご覧ください。ご不明な点があればお尋ねください。 –

答えて

3

はい、それは、これを達成するためにスイングタイマーを使用して回避することが可能ですが、あなたはその後、これをしなかった場合:

    あなたがループして Thread.sleep(...)がオフスレッドバックグラウンドで実行されたことを確認する必要があるだろう
  • Swingイベントスレッドのこれをしないと、イベントスレッドがフリーズしてGUIがフリーズし、役に立たなくなります。
  • そして、バックグラウンドスレッドからSwing呼び出しを行うときに、それらの呼び出しをSwingイベントディスパッチスレッドにキューイングするのに苦労していることを確認する必要があります。これをしないと、スレッドエラーをデバッグするのが非常に難しいことがあります。伴うため余分な作業と、それは間違って得ることのリスクの

、あなたはそれだけでスイングタイマーを使用するずっとに簡単かつ安全であることがわかります。たとえば、投稿されたコードは、whileループとThread.sleep(...)の両方がスレッド化されていないので、GUI /アプリケーション全体をスリープさせる重大な危険にさらされているようです。 (:ないコンパイルやテストコードの警告):

例えば、タイマーなしで、あなたのコードのようなものを見ることができるスイングタイマーは、次のようになりながら、私は好きよりも少し複雑です

new Thread(new Runnable() { 
    public void run() { 
     int counter = 0; 

     while (counter < 10) { 
      lblDisplay.setText("Completed " + Integer.toString(counter)); 
      try { 
       Thread.sleep(1000); 
       final int finalCounter = counter; 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         lblDisplay.setText("Completed " + finalCounter); 
        } 
       }); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      counter++; 
     }  
    } 
}).start(); 

int delay = 1000; 
new Timer(delay, new ActionListener() { 
    private int count = 0; 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (count < 10) { 
      lblDisplay.setText("Completed " + counter); 
     } else { 
      ((Timer) e.getSource()).stop(); // stop the Timer 
     } 
     counter++; 
    } 
}).start(); 

これは、以前よりも簡単で安全です。

+0

こんにちは、助けていただきありがとうございます:) – Jan

関連する問題