我有一个主程序调用{{1}}来获取用户信息,如果用户按提交,我将信息存储在POJO中并将其存入主程序。
如果User点击Exit,我想处理JFrame
,并且想要在main方法中执行一个日志语句后退出主程序。
如果我使用 -
JFrame
所有线程立即退出,我无法在main方法中执行日志记录。
如果我使用 -
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
and
this.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
e.getWindow().dispose();
}
});
我的主要方法执行那些日志记录,但它永远不会退出,在执行所有语句后保持静默。
如果我使用它 -
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
e.getWindow().dispose();
}
});
一切正常。但这是正确的做法吗?
答案 0 :(得分:1)
理论上,如果您dispose
所有顶级窗口,JVM应该干净地终止。
但是,有一些细节需要确保,详见this page:
因此,一个独立的AWT 希望退出的申请 干净利落地不调用System.exit 必须:
- 确保所有AWT或Swing组件都不可显示 申请结束。这可以 通过在所有上调用Window.dispose来完成 顶级Windows。看到 Frame.getFrames。
- 确保没有注册AWT事件侦听器的方法 任何AWT或Swing的应用程序 组件可以遇到无限 无限循环或挂起。对于 例如,一个AWT监听器方法 一些AWT事件触发可以发布一个 相同类型的新AWT事件 EventQueue中。争论是这样的 AWT事件监听器的方法是 通常在辅助线程上执行。
如果你无法找到让程序保持活力的东西,可以采用另一种方式:
- 使用您描述的第一种方法,使用EXIT_ON_CLOSE
- 将ShutdownHook添加到运行时,以执行上次记录语句:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
//logging statements
});
答案 1 :(得分:0)
Dispose
方法仅释放系统资源。
要实际关闭窗口,您必须致电setVisible(false)