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

时间:2015-03-14 18:49:26

标签: java multithreading swing graphics invokelater

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

1)让程序的main方法在JFrame类的实例化中。

2)要有一个在main方法结束时调用SwingUtilities.invokeLater()的类,以延迟处理图形的线程,直到main方法初始化为止。

e.g。 1。     

class program extends JFrame {
   public static void main(String[] args) {....}
}

e.g。 2。

class program implements Runnable {
  public static void main() {
    program p = new program();
    SwingUtilities.invokeLater(p);
  }
  public void run() { ... }
}

如方法2那样使程序线程安全有多重要?另外,每种方法的优点和缺点是什么?即你什么时候使用一种方法而不是另一种?等

1 个答案:

答案 0 :(得分:3)

我遇到了简单的Swing应用程序,如果没有在Swing事件线程上启动就完全失败,这在我设置外观时首先发生。除非在Swing事件线程上启动GUI,否则在任何情况下都无法保证正确运行,因此对于一般的Swing建议,我建议

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

您可以通过让类扩展JFrame来强迫自己在角落里绘制,迫使您创建和显示JFrame,这通常需要更多的灵活性。更常见的是,您的GUI类将面向创建JPanels,然后可以将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts交换。这将大大提高GUI编码的灵活性。你也永远不想直接在JFrame中绘图,因为这可能会错误地绘制其中一个关键组件,但经常在JPanel中绘制,特别是在做动画时,为此你需要扩展JPanel。