【问题标题】:Swing Worker Modal Dialog Won't CloseSwing Worker 模式对话框不会关闭
【发布时间】:2009-12-18 01:04:08
【问题描述】:

我有一个 SwingWorker 线程,它启动一个模式对话框(从一个侦听已启动 StateValue 的属性更改侦听器),并且 swing Worker 继续执行其工作。但是,看起来 done 方法没有被调用,因为在 EDT 上调用了该方法,但是 swing worker 的模态对话框阻塞了 EDT。因此,我无法从 EDT(或 done 方法)关闭对话框。现在,我只是在该方法结束时从 doInBackground 关闭对话框,但这对于 doInBackground 似乎有点不安全,因为它不在 EDT 上。处理这个问题的最佳方法是什么?谢谢。

【问题讨论】:

    标签: java swingworker event-dispatching


    【解决方案1】:

    即使显示模式对话框,调度循环也应继续调度与SwingWorker 关联的事件。

    这对我有用。

    import javax.swing.*;
    
    public class Unions {
        public static void main(String[] args) {
            java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
                runEDT();
            }});
        }
        private static void runEDT() {
            final JDialog dialog = new JDialog((JFrame)null, true);
            new SwingWorker<Void,Void>() {
                @Override protected Void doInBackground() throws Exception {
                    // But this is working.
                    Thread.sleep(3000);
                    return null;
                }
                @Override protected void done() {
                    dialog.setVisible(false);
                }
            }.execute();
            dialog.setVisible(true);
        }
    }
    

    【讨论】:

    • 我不小心显示了来自非 EDT 线程的对话框,因此问题只是有时发生。我猜这有一些问题(虽然我无法弄清楚问题的确切原因),但现在一切都很好,谢谢。
    • assert java.awt.EvenQueue.isDispatchThread(); 是你的朋友(和assert !java.awt.EvenQueue.isDispatchThread();)。
    【解决方案2】:

    供参考:

    当在 Swing 中启动模态对话框时,该线程的执行将停止,直到对话框关闭。

    这就是为什么你的 done() 方法从未被调用过(doInBackground() 无法完成,而 done() 只是在那之后才被调用)。

    从 EDT 线程调用的操作中打开模式对话框略有不同。 EDT 本身将继续处理事件,但打开模态对话框的实际事件线程代码(动作代码)仍然被阻塞(并等待对话框关闭)。

    当然,在非模态对话框的情况下,这个问题永远不会出现。

    顺便说一句:您永远不应该从 EDT 外部打开对话框。 如果决定是在非 EDT 线程上做出的,则需要使用 SwingUtilities.invokeLater() 来实际打开对话框。

    一旦你掌握了 EDT 的概念,听起来很复杂,但实际上并不复杂。

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2020-05-19
      • 2011-03-02
      • 2012-09-20
      • 1970-01-01
      相关资源
      最近更新 更多