我很好奇以下创建Swing窗口的方法之间的区别:
感谢。
答案 0 :(得分:3)
SwingUtilities.invokeLater
只需致电EventQueue.invokeLater
。后者是在Java 1.2中引入的。在此之前,Swing有一个黑客,它重新粉刷了一个窗口进入EDT。我建议java.awt.EventQueue
是这种方法的合理位置,也是明智之举。然而,Swing和AWT之间的关系严重搞砸了。
几乎没有必要继承JFrame
,这通常是不好的做法。但糟糕的做法是Swing的标准。运行多线程就像你可能会遇到问题一样,尽管你可能会在自己的机器上侥幸逃脱。您可以做的最糟糕的事情是在EDT上进行一些初始化,在主线程上进行一些初始化(有一段时间它是50/50,无论FindBugs(所有程序)是否会在单个硬件线程机器上启动)。 / p>
答案 1 :(得分:3)
线程要牢记的是“似乎工作”与“在所有情况下都能证明可行”并不相同。
基本规则是你不应该在事件线程之外创建Swing /操作组件,而应用程序的主线程是“在事件线程之外”。因此,在您的应用程序启动代码中,您应在invokeLater()中创建主窗口。
如果您正在使用Swing进行编程,我将使用swingUtilities版本的invokeLater()。虽然我认为在当前实现中功能上只调用另一个,但我想这可能在将来发生变化。