我有一个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();
}
.............
请帮助我。
答案 0 :(得分:5)
这不能按预期工作的原因是对于模态对话框,方法setVisible()
将阻止调用线程,直到对话框关闭。这意味着调用线程将在pd.s_show()
上阻塞,并且在用户关闭对话框之前不会继续到下一行(Thread.sleep(1000)
)。
解决此问题的最简单方法是删除对setModal(true)
的调用。但是,你将失去模态行为。
P.S。正如radai所提到的,从事件调度线程以外的线程调用Swing代码是不是线程安全的。从这个意义上说,你的代码也被打破了。
答案 1 :(得分:2)
swing操作。 尝试使用SwingUtilities.invokeAndWait()从非gui线程执行你的gui工作。 你可以在这里看到一些例子:http://book.javanb.com/java-threads-3rd/jthreads3-CHP-7-SECT-3.html