从线程关闭JDialog框

时间:2012-09-07 04:06:58

标签: java swing concurrency jdialog event-dispatching

我有一个JDialg用于显示某个任务的进度。要显示和隐藏对话框,我有以下方法,

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();
}
.............

请帮助我。

2 个答案:

答案 0 :(得分:5)

这不能按预期工作的原因是对于模态对话框,方法setVisible()将阻止调用线程,直到对话框关闭。这意味着调用线程将在pd.s_show()上阻塞,并且在用户关闭对话框之前不会继续到下一行(Thread.sleep(1000))。

解决此问题的最简单方法是删除对setModal(true)的调用。但是,你将失去模态行为。

P.S。正如radai所提到的,从事件调度线程以外的线程调用Swing代码是不是线程安全的。从这个意义上说,你的代码也被打破了。

答案 1 :(得分:2)

应始终仅从swing事件调度程序线程调用

swing操作。 尝试使用SwingUtilities.invokeAndWait()从非gui线程执行你的gui工作。 你可以在这里看到一些例子:http://book.javanb.com/java-threads-3rd/jthreads3-CHP-7-SECT-3.html