繁体   English   中英

从线程关闭JDialog框

[英]Closing JDialog box from a thread

我有一个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();
}
.............

请帮助我。

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

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

PS如radai所述,从事件分发线程以外的其他线程调用Swing代码不是线程安全的。 从这种意义上讲,您的代码也被破坏了。

仅应从swing事件调度程序线程调用swing操作。 尝试使用SwingUtilities.invokeAndWait()从非GUI线程执行GUI工作。 您可以在此处看到一些示例: http : //book.javanb.com/java-threads-3rd/jthreads3-CHP-7-SECT-3.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM