gpt4 book ai didi

java - 打开 JFrame 的另一个实例(从 JFrame): use EventQueue. invokeLater? (事件调度线程)

转载 作者:行者123 更新时间:2023-12-01 13:34:53 25 4
gpt4 key购买 nike

一些相关问题:

我想从第一个 JFrame 窗口打开第二个 JFrame 窗口。第一个有一个 main() 方法,以及将打开第二个 JFrame 的按钮单击处理程序。 (小心错别字,我压缩了)。

创建第二个 JFrame 的良好做法是什么? (我认为它必须是一个 JFrame。)我希望能够关闭第一个 JFrame 并让第二个 JFrame 保持运行,因为在第一个 JFrame 用一些数据实例化第二个 JFrame 后它们不会互相通信。

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyMainClass window = new MyMainClass();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public MyMainClass() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 697, 416);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//...
JButton btnNewButton = new JButton("Open Second Window");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {

// Would this be the correct thing to do?
// If this first window is closed, would it
// close the second one as well? (not what I want)

new SecondFrame();

}
});
//...
}

public class SecondFrame extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SecondFrame frame = new SecondFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public SecondFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
}

}

我不明白为什么说使用事件调度线程很重要。

我猜测 SecondFrame 的 main() 函数中的代码不会被调用,因此,它的内容应该移动到按钮的事件处理程序,替换语句 new SecondFrame();?或者我可以保留按钮的单击处理程序不变,并完全删除 SecondFrame 的 main() 方法吗? (setVisible(true); 语句除外)

谢谢!

最佳答案

与 Java 程序的 main 方法不同,所有 Swing 监听器都在事件调度线程中执行。因此,当单击第一帧上的按钮时,您已经处于 EDT 中,无需使用 EventQueue.invokeLater() 打开第二帧。

如果你不打算使用第二个JFrame中的main方法,它确实没有用。只需创建第二个框架的实例,并使其可见:

SecondFrame frame = new SecondFrame();
frame.setVisible(true);

关于java - 打开 JFrame 的另一个实例(从 JFrame): use EventQueue. invokeLater? (事件调度线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21365432/

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