2011-12-11 47 views
1

我想讓這個按鈕禁用其他兩個按鈕,並同時執行一些圖形。這是我想的第一件事:我正確地說明一件事情爲什麼會起作用,爲什麼我之前所做的事情不起作用? (關於線程)

public void actionPerformed(ActionEvent arg0) { 
    reset.setEnabled(false); 
    switcher.setEnabled(false); 
    for (int i = 0; i < 10; i++){ 
      a.change(); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      return; 
     } 
    } 
} 

所以這是按鈕我試圖代碼和切換器和復位的actionPerformed方法的按鈕,我禁用和a.change()應該引起視覺效果。當我嘗試這樣做時,整個程序停止了十秒鐘,然後按鈕被禁用,在這十秒鐘內沒有視覺效果。然後我想:

public void actionPerformed(ActionEvent arg0) { 
    reset.setEnabled(false); 
    switcher.setEnabled(false); 

    if (!s.isAlive()){ 
     s = new Thread(new Changer()); 
     s.start(); 
    } 
    else{ 
     s.interrupt(); 
    } 
} 

在哪裏換爲:

private static class Changer implements Runnable { 
    public void run() { 
     for (int i = 0; i < 10; i++){ 
      a.change(); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
       return; 
      } 
     } 
    } 
} 

這個工作正是我想要的,與按鈕立即被禁用,其次是視覺效果。這樣做的原因是,actionperformed的所有效果都會在退出函數時激活,所以第一種方式是,動作執行結束的時間爲10秒,並且它會在最後執行禁用和10個a.change()s ?第二種方式是在啓動s之後解析,所以按鈕被禁用,然後s繼續並在actionperformed結束後執行它的效果?

+3

我不知道你在這裏問什麼。 –

+0

Swing提供了Timer類來完成你想要做的事情:http://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html – kdgregory

回答

6

是的。

有一個UI線程管理事件和重新繪製(更新屏幕)。在你的第一次嘗試中,你讓它入睡。這樣做意味着在醒來之前沒有其他事情會發生(關於用戶界面)。

1

是的。你是對的。這就是原因。

相關問題