我正在使用SwingUtilities.invokeLater在SwingWorker线程中设置一个模态对话框。我希望SwingWorker线程等到对话框变得可见。做这个的最好方式是什么?我已将以下代码放在SwingWorker对象的doInBackground()方法中。
synchronized (myDialog) {
while (!myDialog.isVisible()) {
myDialog.wait();
}
}
在MyDialog类中重写的setVisible()方法中:
public void setVisible(boolean enabled) {
synchronized (this) {
notifyAll();
}
super.setVisible(enabled);
}
但是,这似乎不起作用,因为存在计时问题 - 必须在super.setVisible()之前调用notifyAll(),因此SwingWorker线程可以处于等待状态。
我正试图找出一个很好的方法来做到这一点,但我感到非常沮丧!
答案 0 :(得分:1)
使用JOptionPane
代替普通JDialog
JOptionPane
阻止代码执行,直到实现某些操作
您可以将JComponents
添加到与JOptionPane
相同的JDialog
答案 1 :(得分:1)
不要使用worker的doInBackground()
方法操作对话框。而是publish()
一个合适的结果,并从process()
开始显示对话框。您还可以注册PropertyChangeListener
,以响应来自setProgress()
的{{1}}来电。这个example说明了这两种机制。
顺便说一句,我会重申@ kleopatra和@ mKorbel的建议,以便更好地解释你想要实现的目标。