这两种方法有什么区别 -System.exit()
和JFrame.dispose()
?
如果我们想在单击按钮时关闭 Java Swing 应用程序,我应该使用哪种方法?
System.exit();
导致 Java VM 完全终止。
JFrame.dispose();
导致JFrame
窗口被操作系统销毁和清理。根据文档,如果没有其他可用的 Windows,这可能会导致 Java VM 终止,但这实际上应该被视为副作用而不是常态。
你选择的那个真的取决于你的情况。如果你想终止当前 Java VM 中的所有内容,你应该使用System.exit()
并且所有内容都会被清理。如果你只想销毁当前窗口,如果这是唯一的窗口,它会关闭 Java VM,然后使用JFrame.dispose()
.
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)
除了上述之外,您还可以使用System.exit()
来返回一个退出代码,如果您使用它自动调用进程,这可能非常有用,System.exit(code);
这可以帮助您确定例如在运行期间是否发生了错误。
如果您打开了多个窗口并且只想关闭已关闭的窗口,请使用JFrame.dispose().
如果要关闭所有窗口并终止应用程序,请使用System.exit()
JFrame.dispose() 仅影响此框架(释放此组件、其子组件和所有子组件使用的所有本机屏幕资源)。System.exit() 影响整个 JVM。
如果您想关闭所有 JFrame 或所有 Window(因为 Frames 扩展了 Windows)以有序模式终止应用程序,您可以执行以下操作:
Arrays.asList(Window.getWindows()).forEach(e -> e.dispose()); // or JFrame.getFrames()
如果您终止程序,则使用 System.exit(0);
另一方面,你有多个窗口,但你可以终止和关闭一个窗口,然后你使用 dispose();