Har*_*sha 0 java concurrency swing jdialog event-dispatching
我有一个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();
}
...........
}
Run Code Online (Sandbox Code Playgroud)
当我尝试从线程中关闭这个JDialog框时,虽然它显示正常但我在调用pd.s_hide()方法时无法隐藏它.
...........
public void run() {
ProgressDisplayer pd = new ProgressDisplayer();
pd.s_show();
Thread.sleep(1000);
pd.s_hide();
}
.............
Run Code Online (Sandbox Code Playgroud)
请帮助我
这不能正常工作的原因是对于模态对话框,该方法setVisible()将阻止调用线程,直到对话框关闭.这意味着调用线程将阻塞pd.s_show(),并且Thread.sleep(1000)在用户关闭对话框之前不会继续到下一行().
解决此问题的最简单方法是删除对此的调用setModal(true).但是,你将失去模态行为.
PS正如radai所提到的,从事件调度线程以外的线程调用Swing代码不是线程安全的.从这个意义上说,你的代码也被打破了.
| 归档时间: |
|
| 查看次数: |
503 次 |
| 最近记录: |