Java 从线程关闭JDialog框

Java 从线程关闭JDialog框,java,swing,concurrency,jdialog,event-dispatching,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);

我有一个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\u hide()
方法时无法隐藏它

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

请帮助我。

应始终仅从swing事件调度程序线程调用swing操作。 尝试使用SwingUtilities.invokeAndWait()从非gui线程执行gui工作。
您可以在这里看到一些示例:

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

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

另外,正如radai提到的,从事件调度线程以外的线程调用Swing代码是不安全的。您的代码也在这个意义上被破坏。

“当..从线程调用..时..不隐藏。”您确认它在未从线程调用时正确隐藏了吗?似乎是一个
setVisible(false)不会误入歧途。