【发布时间】:2012-10-19 07:46:59
【问题描述】:
我需要一种方法来从数据库中获取一些数据并防止用户在那一刻修改现有数据。
我创建了一个 SwingWorker 来更新数据库,并创建了一个模态 JDialog 来向用户显示正在发生的事情(使用 JProgressBar)。模态对话框的 defaultCloseOperation 设置为 DO_NOTHING,因此只能通过适当的调用关闭 - 我使用 setVisible(false)。
MySwingWorkerTask myTask = new MySwingWorkerTask();
myTask.execute();
myModalDialog.setVisible(true);
SwingWorker 在 doInBackground() 中做了一些事情,最后它调用:
myModalDialog.setVisible(false);
我唯一关心和我的问题:
SwingWorker 是否有可能在 worker 生成后的行中的 setVisible(true) 之前执行 setVisible(false)?
如果是这样,setVisible(true) 可能会永远阻塞(用户无法关闭模式窗口)。
我是否必须实现以下内容:
while (!myModalDialog.isVisible()) {
Thread.sleep(150);
}
myModalDialog.setVisible(false);
确保它真的会关闭?
【问题讨论】:
-
您应该在
done()中调用myModalDialog.setVisible(false);而不是doInBackground()。为什么不在execute之前打电话给setVisible(true)? -
setVisible(true) 是一个阻塞调用
-
哈哈 - 确实很好:-)
-
如需尽快获得更好的帮助,请发帖SSCCE。
-
好的,我会再试一次。感谢 done() 提示。
标签: java multithreading swing jdialog swingworker