Swing 窗口的初始化方式有啥区别?

Posted

技术标签:

【中文标题】Swing 窗口的初始化方式有啥区别?【英文标题】:What is the difference between the ways a Swing window can be initialized?Swing 窗口的初始化方式有什么区别? 【发布时间】:2010-12-07 05:44:11 【问题描述】:

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

    在 main() 中使用 java.awt.EventQueue.invokeLater(); 在 main() 中使用 SwingUtilities.invokeLater(); 根本不关心线程,只需实例化 JFrame 子类并从 main 调用 setVisible(true) 而不将其包装在 Runnable 中;这似乎仍然有效。

谢谢。

【问题讨论】:

【参考方案1】:

使用线程要记住的是,“似乎有效”与“在所有情况下都可以证明有效”不同。

基本规则是您不应该在事件线程之外创建 Swing/操作组件,并且应用程序的主线程是“在事件线程之外”。因此,在您的应用程序启动代码中,您应该在 invokeLater() 中创建主窗口。

如果您使用 Swing 进行编程,我会使用 SwingUtilities 版本的 invokeLater()。尽管我认为在当前的实现中,一个只是调用另一个,但我想这在未来可能会改变。

【讨论】:

【参考方案2】:

SwingUtilities.invokeLater 只是调用EventQueue.invokeLater。后者是在 Java 1.2 中引入的。在此之前,Swing 有一个 hack,它重新粉刷了一个窗口以进入 EDT。我建议java.awt.EventQueue 是这种方法的合乎逻辑的地方,也是明智的选择。但是,Swing 和 AWT 之间的关系严重混乱。

很少需要子类化JFrame,这通常是不好的做法。但是不好的做法是 Swing 的标准。像这样运行多线程可能会遇到问题,尽管您可能会在自己的机器上侥幸逃脱。您可以做的最糟糕的事情是在 EDT 上进行一些初始化,在主线程上进行一些初始化(有一段时间,FindBugs(所有程序)是否会在单个硬件线程机器上启动是 50/50)。

【讨论】:

"几乎不需要子类化 JFrame,这通常是不好的做法。" - 现在这让我感兴趣了。 NetBeans 在创建应用程序骨架时自动为我完成了这项工作。您能否详细说明为什么这是一件坏事? 不太明白继承 JFrame 的问题。如果您在逻辑上需要的是 JFrame 的子类,请创建 JFrame 的子类... 您很少需要JFrame子类。就像您很少需要 Thread 的子类一样。 @Tom:虽然我同意 WRT Thread,但请为 JFrame 辩护。 我想这就是汤姆的意思:***.com/questions/1143923/…

以上是关于Swing 窗口的初始化方式有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

直接初始化类成员与在方法中执行它有啥区别?

wpf中 closing事件和unload事件有啥区别?

GUI编程--03--Swing

使用JAVAFX和SWING有啥区别[重复]

GUI编程Swing的简单应用

StatefulWidget 中的以下 var 初始化位置有啥区别?