0

我正在使用 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);
}

但是,这似乎不起作用,因为存在时间问题 - notifyAll() 必须在 super.setVisible() 之前调用,因此 SwingWorker 线程可以处于等待状态。

我试图找出一个很好的方法来做到这一点,但我很沮丧!

4

2 回答 2

1

不要从工作人员的doInBackground()方法中操作对话框。取而代之publish()的是适当的结果并使对话框从process(). 您还可以注册一个PropertyChangeListener将被触发以响应setProgress()来自 的调用doInBackground()。这个例子说明了这两种机制。

顺便说一句,我会重申@kleopatra 和@mKorbel 的建议,以更好地解释您到底想要实现什么。

于 2012-11-14T14:33:45.167 回答
1
  • 使用JOptionPane而不是普通的JDialog

  • JOptionPane阻止代码执行,直到某些动作实现

  • 你可以添加JComponentsJOptionPane相同的JDialog

于 2012-11-14T11:32:33.950 回答