我是Java Swing GUI开发的新手。在一些示例代码中,我看到Swing窗口显示为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()
的情况下显示一个窗口:
public static void main(String[] args) {
MainWindow window=new MainWindow();
window.setDefaultCloseOperation(EXIT_ON_CLOSE);
window.setVisible(true);
System.out.println("main exited");
}
那么区别是什么?我什么时候应该使用每种方法?
答案 0 :(得分:4)
从main()方法调用代码时,您应始终使用EventQueue.invokeLater()
,因为应在事件调度线程(EDT)上创建所有Swing组件。
是的,在以其他方式创建简单的GUI时,代码将有99.99%的时间工作,但您不想浪费时间调试随机错误。
阅读Concurrency and Swing上Swing教程中的部分,了解有关EDT的更多信息以及为什么应该在EDT上创建Swing组件。
注意,从EDT调用从Swing侦听器执行的代码。