了解Java事件调度线程中引发的代码范围

时间:2011-10-16 14:34:10

标签: java swing event-handling event-dispatch-thread

我正在尝试了解将从事件调度线程(EDT)管理哪些事件。

让我们假设一些简单的东西,一段简单的代码,简单地打开一个JOptionPane,等待用户的响应,然后关闭它。与此对象相关的事件现在放在EDT上?是吗: a)只是创建对象(JOptionPane)。 b)对象生命周期内的所有对象相关事件。 C)其他(请注明)。

谢谢,

埃利奥特

见下文:

        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run(){
                    JOptionPane.showMessageDialog(myComponent, msg);
                }
            });
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

2 个答案:

答案 0 :(得分:2)

据我所知,以下所有“事件”都将在EDT中执行:

  • 由最终用户直接触发的所有事件(鼠标事件,关键事件)以及由这些事件触发的所有更高级事件(action,focus ...);实际上你可以说所有的AWT和Swing EventListener总是在EDT中被调用
  • 所有绘画代码(由组件变化或寡妇大小或位置变化触发,当需要绘制区域时)
  • 通过SwingUtilities.invokeAndWait()SwingUtilities.invokeLater()调用的任何代码。

答案 1 :(得分:1)

所有JOptionPane对话框都是模态的:它们阻止用户生成的输入事件到其他窗口,但EventQueue继续处理所有窗口的事件。在此DialogTest中,动画在JOptionPane.showMessageDialog()等待输入时继续。有一个相关的讨论here