gpt4 book ai didi

Java EDT 和生成对话

转载 作者:行者123 更新时间:2023-11-30 09:23:35 24 4
gpt4 key购买 nike

我正在尝试学习 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 class GUITopLevel implements FrontOfHouse {    
JFrame topLevelFrame;

Controller control;

GUITopLevel(Controller c) {
control = c;
}

@Override
public void GUI() {
// Create an action
MenuAction action = new MenuAction(control);

// Create the Frame
topLevelFrame = new JFrame();

// Create the menu bar
JMenuBar menuBar = new JMenuBar();
JMenu file = new JMenu("File");
JMenu edit = new JMenu("Edit");

JMenuItem file1 = new JMenuItem();
JMenuItem file2 = new JMenuItem();
JMenuItem file3 = new JMenuItem();

JMenuItem edit1 = new JMenuItem();

// Set the actions
file1.setAction(action);
file2.setAction(action);
file3.setAction(action);
edit1.setAction(action);

// Add the menu items
file.add(file1);
file.add(file2);
file.add(file3);

edit.add(edit1);

// Set the text
file1.setText("Import Diagrams");
file2.setText("Settings");
file3.setText("Exit");
edit1.setText("Cut");
// Add the menus together
menuBar.add(file);
menuBar.add(edit);

// Set size and add menu bar
topLevelFrame.setSize(600,400);
topLevelFrame.setJMenuBar(menuBar);

topLevelFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

@Override
public void init() {
GUI();
//topLevelFrame.pack();
topLevelFrame.setVisible(true);
}
}

当一个菜单项被点击时,在 Controller 中调用:

public void menuCatch(JMenuItem eventSource) {
JOptionPane.showMessageDialog(gui.topLevelFrame, eventSource.getActionCommand());
}

由于 gui 是 JOptionPane 的父容器,并且是使用 invokeLater 创建的,这是否意味着新生成的 JOptionPane 已在 EDT 上被调用还是在 EDT 之外被调用?

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

最佳答案

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

  • Swing GUI 对象应该event dispatch thread 上构造和操作(美东时间)。这example是典型的,使用 EventQueue.invokeLater()。请特别注意 TimeractionPerformed() 方法在 EDT 上运行。相比之下,您的 GUITopLevel 似乎是在初始线程上实例化的,而不是在您的 Runnable 中实例化的。

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

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

另见 Q&A还有这个Q&A在 Swing 中的 MVC 上。

关于Java EDT 和生成对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15990048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com