2

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

1) 将程序的 main 方法放在 JFrame 类的实例中。

2) 拥有一个在 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 中那样使程序线程安全有多重要?另外,每种方法的优缺点是什么?即你什么时候会使用一种方法而不是另一种方法?等等

4

1 回答 1

4

我遇到过简单的 Swing 应用程序,如果没有在 Swing 事件线程上启动,它们就会彻底失败,这首先发生在我设置外观和感觉时。除非在 Swing 事件线程上启动 GUI,否则在任何情况下都不能保证正确运行,因此对于一般 Swing 建议,我建议

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

您可以通过让您的类扩展 JFrame 来将自己描绘成一个角落,当通常需要更大的灵活性时,您可以强制创建和显示 JFrame。更常见的是,您的 GUI 类将用于创建 JPanel,然后可以将其放入 JFrames 或 JDialogs 或 JTabbedPanes 中,或者在需要时通过 CardLayouts 进行交换。这将大大增加您的 GUI 编码的灵活性。您也永远不会想要直接在 JFrame 中绘制,因为这可能会错误绘制其关键组件之一,但经常会在 JPanel 中绘制,尤其是在制作动画时,为此您需要扩展 JPanel。

于 2015-03-14T19:18:39.363 回答