当模态对话框变得可见时如何通知线程?

时间:2012-11-14 11:27:20

标签: java multithreading swing modal-dialog

我正在使用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线程可以处于等待状态。

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

2 个答案:

答案 0 :(得分:1)

  • 使用JOptionPane代替普通JDialog

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

  • 您可以将JComponents添加到与JOptionPane相同的JDialog

答案 1 :(得分:1)

不要使用worker的doInBackground()方法操作对话框。而是publish()一个合适的结果,并从process()开始显示对话框。您还可以注册PropertyChangeListener,以响应来自setProgress()的{​​{1}}来电。这个example说明了这两种机制。

顺便说一句,我会重申@ kleopatra和@ mKorbel的建议,以便更好地解释你想要实现的目标