在 Swing 中显示 window 的两种方式有什么区别?
What's the difference between the 2 ways of showing window in Swing?
我是 Java Swing GUI 开发的新手。在一些示例代码中,我看到 Swing window 显示为 EventQueue.invokeLater()
:
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
MainWindow window=new MainWindow();
window.setDefaultCloseOperation(EXIT_ON_CLOSE);
window.setVisible(true);
}
});
System.out.println("main exited");
}
但正如我所尝试的,我也可以在不使用 EventQueue.invokeLater()
的情况下显示 window:
public static void main(String[] args) {
MainWindow window=new MainWindow();
window.setDefaultCloseOperation(EXIT_ON_CLOSE);
window.setVisible(true);
System.out.println("main exited");
}
那有什么区别呢?我应该什么时候使用每种方法?
从 main() 方法调用代码时,您应始终使用 EventQueue.invokeLater()
,因为所有 Swing 组件都应在事件调度线程 (EDT) 上创建。
是的,当以另一种方式创建简单的 GUI 时,代码将在 99.99% 的时间内运行,但您不想浪费时间调试一个不起作用的随机错误。
阅读有关 Concurrency and Swing 的 Swing 教程部分,了解有关 EDT 的更多信息以及为什么应在 EDT 上创建 Swing 组件。
注意,从 Swing 侦听器执行的代码是从 EDT 调用的。
我是 Java Swing GUI 开发的新手。在一些示例代码中,我看到 Swing window 显示为 EventQueue.invokeLater()
:
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
MainWindow window=new MainWindow();
window.setDefaultCloseOperation(EXIT_ON_CLOSE);
window.setVisible(true);
}
});
System.out.println("main exited");
}
但正如我所尝试的,我也可以在不使用 EventQueue.invokeLater()
的情况下显示 window:
public static void main(String[] args) {
MainWindow window=new MainWindow();
window.setDefaultCloseOperation(EXIT_ON_CLOSE);
window.setVisible(true);
System.out.println("main exited");
}
那有什么区别呢?我应该什么时候使用每种方法?
从 main() 方法调用代码时,您应始终使用 EventQueue.invokeLater()
,因为所有 Swing 组件都应在事件调度线程 (EDT) 上创建。
是的,当以另一种方式创建简单的 GUI 时,代码将在 99.99% 的时间内运行,但您不想浪费时间调试一个不起作用的随机错误。
阅读有关 Concurrency and Swing 的 Swing 教程部分,了解有关 EDT 的更多信息以及为什么应在 EDT 上创建 Swing 组件。
注意,从 Swing 侦听器执行的代码是从 EDT 调用的。