JavaEDT和生成对话

JavaEDT和生成对话,java,swing,model-view-controller,joptionpane,event-dispatch-thread,Java,Swing,Model View Controller,Joptionpane,Event Dispatch Thread,我正在努力学习Swing的复杂性,并且已经阅读了大量关于事件调度线程的内容。我明白这是为了什么,但我正在努力与以下概念: 我有一个JFrame,它是以正常方式调用的: public class Controller { GUITopLevel gui = new GUITopLevel(this); public void initiate() { SwingUtilities.invokeLater( new Runnable() {

我正在努力学习Swing的复杂性,并且已经阅读了大量关于事件调度线程的内容。我明白这是为了什么,但我正在努力与以下概念:

我有一个JFrame,它是以正常方式调用的:

public class Controller {
GUITopLevel gui = new GUITopLevel(this);

public void initiate() {        
    SwingUtilities.invokeLater(
            new Runnable() {
                @Override
                public void run() {
                    gui.init();
                }
            }
    );
}

public void menuCatch(JMenuItem eventSource) {
    JOptionPane.showMessageDialog(gui.topLevelFrame, eventSource.getActionCommand());
}
}
我想从gui生成JDialogs(代码如下):

单击菜单项时,将在控制器中调用该菜单项:

public void menuCatch(JMenuItem eventSource) {
    JOptionPane.showMessageDialog(gui.topLevelFrame, eventSource.getActionCommand());
 }
由于
gui
是JOptionPane的父容器,并且是使用
invokeLater
创建的,这是否意味着新生成的JOptionPane已在EDT上调用,还是在EDT外部调用


抱歉,如果这是重复的,我似乎找不到这个问题的答案。

您的问题提出了两个关键问题:

  • Swing GUI对象应仅在(EDT)上构造和操作。这是典型的,使用
    EventQueue.invokeLater()
    。请特别注意,
    Timer
    actionPerformed()
    方法在EDT上运行。相反,您的
    guitoplavel
    似乎是在初始线程上实例化的,而不是在
    Runnable
    中实例化的

  • 模式对话框将阻止来自同一应用程序的其他窗口的用户输入,但EDT将继续运行。在中,向
    run()
    方法添加一个对话框以查看效果

    public void run() {
        ...
        f.setVisible(true);
        JOptionPane.showMessageDialog(dt, TITLE);
    }
    

在Swing中的MVC上也可以看到这个和这个。

它在EDT上被调用。谢谢。因此,在线程外部向
gui
附加JDialog的调用将在EDT上处理,因为
gui
就是在这里创建的?这是我对它的理解。如果要分离操作,可以在其中一个辅助线程上工作。大。。。我现在明白了——正如我所理解的,工作线程是为非GUI工作而产生的。工作线程用于Swing,以避免在执行需要大量处理的操作时GUI锁定。不过,一个简单的弹出操作并不会真正锁定GUI。谢谢。我使用
swingUtilities.isEventDispatchThread()
来确定TopLevelFrame正在EDT上运行,并且似乎是(返回true)。
public void run() {
    ...
    f.setVisible(true);
    JOptionPane.showMessageDialog(dt, TITLE);
}