2012-09-07 106 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代码不是线程安全的。你的代码在这个意义上也被打破了。