我最近开始学习如何在Java中使用Swing和图形,并遇到了两种不同的设计GUI的方法。
1)在JFrame类的初始化中拥有程序的主要方法。
2) 在 main 方法的末尾有一个调用 SwingUtilities.invokeLater() 的类,以将处理图形的线程延迟到主方法初始化之后。
例如 1.
class program extends JFrame {
public static void main(String[] args) {....}
}
例如 2.
class program implements Runnable {
public static void main() {
program p = new program();
SwingUtilities.invokeLater(p);
}
public void run() { ... }
}
像方法 2 中那样使程序线程安全有多重要?另外,每种方法的优点和缺点是什么?即你什么时候会使用一种方法而不是另一种方法?等。
我遇到了简单的 Swing 应用程序,如果不在 Swing 事件线程上启动,它们会直接失败,这首先发生在设置外观和感觉时。此外,除非 GUI 在 Swing 事件线程上启动,否则在任何情况下都不能保证正确运行,因此对于一般的 Swing 建议,我建议
- 始终尝试在 Swing 事件线程上启动 GUI。
- 避免扩展 JFrame,因为它几乎从不需要,并限制您的代码。
- 如果您的 GUI 执行图形,请扩展 JPanel,尤其是当它执行动画时
- 或者,如果您想更好地控制设置 GUI 的大小,并为此覆盖
getPreferredSize()
。
你可以通过让你的类扩展 JFrame,迫使你创建和显示 JFrame,这通常需要更大的灵活性。更常见的是,您的GUI类将面向创建JPanels,然后可以将其放入JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高 GUI 编码的灵活性。你也永远不会想直接在 JFrame 中绘制,因为这有错误绘制其关键组件之一的风险,但确实经常在 JPanel 中绘制,尤其是在制作动画时,为此您需要扩展 JPanel。