2016-11-07 3 views
0

スレッドを使用してカウントダウンタイマーを作成したかったのですが(試してみたことです)、UIを作成しました。私はThread.yield()を使ってみましたが、うまくいきませんでした。私は別の質問で見たinvokeLater()トリックをやろうとしましたが、それでも私に与えることはできませんconvert void to Threadスレッドはカウントダウン中にUIをフリーズします

UIが1秒ごとに通過すると、JTextFieldが更新されます。スレッドセーフ

field = new JTextArea();  
Button = new JButton(); 
Button.addActionListener 
(
    new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      for (int i = Integer.parseInt(field.getText()); i >= 0; i--) 
      { 
       try 
       { 
        Thread.sleep(1000); 
       } 
       field.setText(Integer.toString(i)); 
      } 
     } 
    } 
); 
+3

UIスレッドでスリープしてはいけません。 – SLaks

+0

あなたはこれを見てみたいです。http://stackoverflow.com/questions/40265427/updating-swt-periodically-causes-gui-to-freeze –

+0

スレッドを使用していて、まったく新しいことを詳しく教えてください。D: – Bruce

答えて

1

スレッドをまったく使用していません。試してみてください:

field = new JTextArea();  
    Button = new JButton(); 
     Button.addActionListener 
     (
      new ActionListener() 
      { 
       public void actionPerformed(ActionEvent ae) 
       { 
        new Thread() {public void run() { 
         for (int i = Integer.parseInt(field.getText()); i >= 0; i--) 
         { 
          try 
          { 
           Thread.sleep(1000); 
          } 
          field.setText(Integer.toString(i)); 
         } 
        }}.start(); 
       } 
      } 
     ); 
+0

ああ私の神、あなたは生き方です!どうもありがとうございます!!私は何時間もこれをしてきましたが、私はちょうどこれを行かせることができませんでした。私は愚かな間違いのためにとても残念ですD: – Bruce

0

「ほとんどのSwingのオブジェクトのメソッドではないので、Swingのイベント処理コードは、イベントディスパッチスレッドと呼ばれる特殊なスレッド上で実行されます。また、Swingメソッドを呼び出し、このスレッド上で動作するほとんどのコードを。これが必要です」 ":複数のスレッドからそれらを呼び出すと、スレッドの干渉やメモリの一貫性のエラーが発生する可能性があるSwingコンポーネントのメソッドには、API仕様の「スレッドセーフ」というラベルが付いています。このルールを無視するプログラムは、ほとんどの場合正しく機能するかもしれませんが、再現するのが困難な予期しないエラーが発生する可能性があります。 - からhttps://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

イベントディスパッチャスレッドはスイングの基本です。ワーカースレッドを使用します。

関連する問題