从线程关闭JDialog框

Har*_*sha 0 java concurrency swing 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();
        }

    ...........
}
Run Code Online (Sandbox Code Playgroud)

当我尝试从线程中关闭这个JDialog框时,虽然它显示正常但我在调用pd.s_hide()方法时无法隐藏它.

...........
public void run() {            
                ProgressDisplayer pd = new ProgressDisplayer();
                pd.s_show();                    
                Thread.sleep(1000);
                pd.s_hide();
}
.............
Run Code Online (Sandbox Code Playgroud)

请帮助我

Jim*_*imN 5

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

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

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