第一个 JFrame 应该用 'invokeLater' 创建,还是可以直接从 main 创建?



我最近开始学习如何在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。

相关内容

  • 没有找到相关文章

最新更新