Java 从线程关闭JDialog框
我有一个JDialg来显示某项任务的进度。要显示和隐藏对话框,我有以下方法: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);
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)代码>不会误入歧途。