可以初始化Swing窗口的方式有什么区别?

时间:2009-10-15 23:49:41

标签: java swing jframe

我很好奇以下创建Swing窗口的方法之间的区别:

  1. 在main()中使用java.awt.EventQueue.invokeLater();
  2. 在main();
  3. 中使用SwingUtilities.invokeLater()
  4. 根本不打扰线程,只是实例化JFrame子类并从main调用setVisible(true)而不将其包装在Runnable中;无论如何,这似乎都有效。
  5. 感谢。

2 个答案:

答案 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()。虽然我认为在当前实现中功能上只调用另一个,但我想这可能在将来发生变化。