【问题标题】:JFrame.dispose() vs System.exit()JFrame.dispose() 与 System.exit()
【发布时间】:2012-11-01 20:43:21
【问题描述】:

这两种方法有什么区别——System.exit()JFrame.dispose()

如果我们想在单击按钮时关闭 Java Swing 应用程序,我应该使用哪种方法?

【问题讨论】:

  • 点击按钮。是关于带有 System.exit(0) 的独立 JButton 或来自 JFrames ToolBar 中的按钮
  • JFrame.dispose()triggers a bug,看来System.exit()是建议

标签: java swing jvm jframe


【解决方案1】:

System.exit(); 导致 Java VM 完全终止。

JFrame.dispose(); 导致JFrame 窗口被操作系统销毁和清理。根据documentation,如果没有其他可用的 Windows,这可能会导致 Java VM 终止,但这实际上应该被视为副作用而不是常态。

你选择的那一个真的取决于你的情况。如果你想终止当前 Java VM 中的所有内容,你应该使用System.exit() 并且所有内容都会被清理。如果你只想销毁当前窗口,如果这是唯一的窗口,它会关闭 Java VM,然后使用JFrame.dispose()

【讨论】:

  • 我看到 System.exit 的问题是它真的会杀死应用程序,即使一个线程正在写入文件。在我看来,大多数应用程序都会关闭窗口,而不是等待其余线程完成。但由于 AWT 线程可能无法完成,我们遇到了如何在 Java 中正确实现这一点的问题。
  • 感谢文档。我在找这个
  • @TomášZato-ReinstateMonica 该线程将意味着虚拟机也永远不会退出。解决方案是确保“关闭”按钮不可访问。如果您的意图是关闭应用程序,则应该调用 System.exit。确保在持续时间内禁用导致此问题的任何 UI 元素的组合,+ Runtime 的 addShutdownHook 用于清理。
【解决方案2】:

JFrame.dispose()

public void dispose()

释放此 Window、其子组件及其所有子组件使用的所有本机屏幕资源。也就是说,这些组件的资源将被销毁,它们消耗的任何内存都将返回给操作系统,并且它们将被标记为不可显示。 通过随后调用 pack 或 show 重建本机资源,可以使 Window 及其子组件再次可显示。重新创建的 Window 及其子组件的状态将与这些对象在 Window 被释放时的状态相同(不考虑这些操作之间的额外修改)。

注意:当 Java 虚拟机 (VM) 中的最后一个可显示窗口被处理掉时,VM 可能会终止。有关详细信息,请参阅 AWT 线程问题。

System.exit()

public static void exit(int status)

终止当前运行的 Java 虚拟机。该参数用作状态码;按照惯例,非零状态码表示异常终止。 该方法调用 Runtime 类中的 exit 方法。此方法永远不会正常返回。

调用System.exit(n)实际上等同于调用:

Runtime.getRuntime().exit(n)

【讨论】:

    【解决方案3】:

    除上述之外,您还可以使用System.exit() 返回一个退出代码,如果您使用System.exit(code); 自动调用进程,这可能会非常有用,这可以帮助您确定例如在执行过程中是否发生错误运行。

    【讨论】:

      【解决方案4】:
      • 如果您打开了多个窗口并且只想关闭已关闭的窗口,请使用JFrame.dispose().

      • 如果您想关闭所有窗口并终止应用程序,请使用System.exit()

      【讨论】:

        【解决方案5】:

        JFrame.dispose() 仅影响此框架(释放此组件、其子组件和所有子组件使用的所有本机屏幕资源)。 System.exit() 影响整个 JVM。

        如果你想关闭所有 JFrame 或所有 Window(因为 Frames 扩展了 Windows)以有序模式终止应用程序,你可以这样做:

        Arrays.asList(Window.getWindows()).forEach(e -> e.dispose()); // or JFrame.getFrames()
        

        【讨论】:

          【解决方案6】:

          如果您终止程序,则使用 System.exit(0);

          另一方面,你有多个窗口,但你可以终止和关闭一个窗口,然后你使用 dispose();

          【讨论】:

          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-06
          • 1970-01-01
          • 2013-10-05
          • 2014-01-20
          • 2017-10-25
          相关资源
          最近更新 更多