2012-09-07 110 views
0

我有一個JDialg用於顯示某個任務的進度。要顯示和隱藏對話框我有以下方法,從線程關閉JDialog框

public class ProgressDisplayer extends javax.swing.JDialog { 
    ...... 
    public void s_show() { 
      this.setTitle("Month End Status"); 
      setModal(true); 
      setResizable(false); 
      pack(); 
      this.setLocationRelativeTo(null); 
      this.setVisible(true); 
     } 

     public void s_hide() { 
      this.dispose(); 
     } 

    ........... 
} 

當我嘗試從如下線程關閉此的JDialog框,雖然顯示正常但我不能隱藏它,當我打電話pd.s_hide()方法。

........... 
public void run() {    
       ProgressDisplayer pd = new ProgressDisplayer(); 
       pd.s_show();      
       Thread.sleep(1000); 
       pd.s_hide(); 
} 
............. 

請幫助我。

+1

*「當......從一個線程..不隱藏。」*您是否確認,當它從線程中調用** not **時它會正確隱藏?看起來像一個'setVisible(false);'不會誤入歧途。 –

回答

5

像您期望這不工作的原因是,模態對話框,該方法setVisible()會阻塞調用線程,直到對話框關閉。這意味着調用線程將在pd.s_show()上阻塞,並且不會繼續到下一行(Thread.sleep(1000)),直到用戶關閉對話框。

解決此問題的最簡單方法是取消對setModal(true)的呼叫。但是,你會失去模態行爲。

P.S.正如Radai提到的,​​從事件調度線程以外的線程調用Swing代碼不是線程安全的。你的代碼在這個意義上也被打破了。