JavaEDT和生成对话
我正在努力学习Swing的复杂性,并且已经阅读了大量关于事件调度线程的内容。我明白这是为了什么,但我正在努力与以下概念: 我有一个JFrame,它是以正常方式调用的: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() {
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
方法在EDT上运行。相反,您的actionPerformed()
似乎是在初始线程上实例化的,而不是在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);
}