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 窗口的初始化方式有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章