2013-05-28 27 views
1

嘿,我只需要一個問題的答案... 我將如何使下面的代碼不凍結我的整個JFrame?如何使一個線程不凍結你整個JFrame。 JAVA

   try { 
       Thread.sleep(Integer.parseInt(delayField.getText()) * 1000); 
       System.out.println("Hello!"); 
      } catch(InterruptedException ex) { 
       Thread.currentThread().interrupt(); 
      } 

回答

7

使用不同的線程來執行這個任務。如果你這樣做的主UI線程,然後將凍結。例如,你可以按照

new Thread() { 

     @Override 
     public void run() { 
      try { 
       Thread.sleep(Integer.parseInt(delayField.getText()) * 1000); 
       System.out.println("Hello!"); 
      } catch (InterruptedException ex) { 
       Thread.currentThread().interrupt(); 
      } 

     } 
    }.start(); 

UPDATE

後我有更好的更新的答案羅賓和馬爾科的明智建議做解。

ActionListener taskPerformer = new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
       System.out.println("Hello!"); 

     } 
    }; 
    javax.swing.Timer t = new javax.swing.Timer(Integer.parseInt(delayField.getText()) * 1000, taskPerformer); 
    t.setRepeats(false); 
    t.start(); 
+0

謝謝你的工作:D – user2413200

+2

因爲'JTextField#getText'不是線程安全的,你不應該從另一個線程調用那個方法,那麼EDT – Robin

+0

@Robin,yup沒有想到,而後postin :(...一個同步的方法可以用來獲取文本..會有任何副作用嗎? – stinepike

1

你不想在UI執行這個(或事件調度線程)線程。而是在一個單獨的線程中。否則(如你所見)你會阻止用戶界面。

這是一個很好的做法,在一個單獨的線程中執行耗時的操作,並利用SwingUtilities.invokeLater()如果這些線程需要執行(在UI例如,在上面顯示「你好」)的一些後續UI動作

3

無論你什麼時候在你的GUI代碼中使用Thread.sleep,阻止自己想想搖擺定時器,這是這個職位的合適的工具。安排您需要延遲執行的任務。

對此使用另一個線程並不是最好的建議:它浪費了一個沉重的系統資源(一個線程)來完成任何事情,只能等待。