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

Should the first JFrame be created with 'invokeLater' or can it be created directly from main?

我最近开始学习如何在 Java 中使用 Swing 和图形,并且遇到了两种不同的 GUI 设计方法。

1) 在 JFrame 的实例化中使用程序的主要方法 class。

2) 要有一个 class,它在 main 方法的末尾调用 SwingUtilities.invokeLater() 来延迟处理图形的线程,直到 main 方法初始化之后。

例如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 事件线程上启动,这些应用程序就会彻底失败,这是我在设置外观时首先遇到的。另外 运行ning 在任何情况下都不能保证正确,除非 GUI 在 Swing 事件线程上启动,因此对于一般的 Swing 建议,我建议

  • 始终尝试在 Swing 事件线程上启动 GUI。
  • 避免扩展 JFrame,因为它几乎从不需要,并且会限制您的代码。
  • 如果您的 GUI 有图形,请扩展 JPanel,尤其是有动画时
  • 或者,如果您想更好地控制 GUI 的大小设置,请为此覆盖 getPreferredSize()

您可以通过 class 扩展 JFrame 将自己画在角落里,迫使您创建和显示 JFrame,这通常需要更大的灵活性。更常见的是,您的 GUI classes 将用于创建 JPanel,然后可以将其放入 JFrames 或 JDialogs,或 JTabbedPanes,或通过 CardLayouts 在任何需要的地方进行交换。这将大大增加您的 GUI 编码的灵活性。您也永远不会想直接在 JFrame 中绘制,因为这可能会错误地绘制其关键组件之一,但通常会在 JPanel 中绘制,尤其是在执行动画时,为此您将需要扩展 JPanel。