[英]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.