我在我的应用程序中使用JDialog作为主窗口(最初是JFrame,但它在任务栏中显示,这不是我想要的)。
目前我正在执行以下操作:
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
当我点击退出按钮时:
frame.dispose();
但是这个过程似乎仍然停留在后台。
JFrame拥有JFrame.EXIT_ON_CLOSE
,看起来可以满足我的需求。
我该如何正确地关闭我的应用程序?
我在我的应用程序中使用JDialog作为主窗口(最初是JFrame,但它在任务栏中显示,这不是我想要的)。
目前我正在执行以下操作:
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
当我点击退出按钮时:
frame.dispose();
但是这个过程似乎仍然停留在后台。
JFrame拥有JFrame.EXIT_ON_CLOSE
,看起来可以满足我的需求。
我该如何正确地关闭我的应用程序?
你需要添加一个WindowListener,在对话框关闭时执行System.exit(0)。
JDialog dialog = ...;
dialog.addWindowListener(new WindowAdapter() {
@Override public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
当然,在你按下退出按钮后使用System.exit(0)仍然是必要的(这是在本主题中其他地方提出的建议)。
你可以添加
System.exit(0);
您可以在dispose()代码行后面立即结束程序。
JWindow
,但这有点复杂,因为JWindow
需要从父级JFrame
进行初始化(只需存在即可,没有其他要求)。WindowListener
,所有事件/操作都将被重定向/管理这种方式。你知道EXIT_ON_CLOSE
字段也被JDialog
继承了,对吧?
正如@camickr所提到的,EXIT_ON_CLOSE
不是JDialog
类的setDefaultCloseOperation
方法的有效值。根据API所述,
DO_NOTHING_ON_CLOSE
(在WindowConstants
中定义):不做任何事情;要求程序在已注册的WindowListener
对象的windowClosing
方法中处理该操作。HIDE_ON_CLOSE
(在WindowConstants
中定义):在调用任何注册的WindowListener
对象之后自动隐藏对话框。DISPOSE_ON_CLOSE
(在WindowConstants
中定义):在调用任何已注册的WindowListener
对象之后自动隐藏和释放对话框。如果将EXIT_ON_CLOSE
作为参数传递,则会抛出IllegalArgumentException
异常。
EXIT_ON_CLOSE
是一个继承的字段。我不是故意让这个微妙之处文档不完整。 - mresetDefaultCloseOperation()
方法的有效值在API中有明确的文档说明。我仍然无法相信在我的评论之后这个回答还会得到赞同。顺便说一下,我的回答中没有攻击你的人格,我只是简单地陈述了答案是错误的。我们都会犯错(我知道我经常犯错),我只希望我们能从中学习。 - camickr你可以尝试下面这段惊人的源代码 -
JDialog dialog = (JDialog) container;
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setModal(false);
dialog.setVisible(false);
dialog.dispose();
Runtime.getRuntime().exit(1);
以上所述将关闭进程并在处理JDialog容器后进行处理,还有一个好处是,如果此JDialog在任何其他JFrame或JDialog上运行,则父级不会终止,但如果此JDialog独立运行,则进程将完全终止,享受吧。
对我来说,只有在windowClosing事件中起作用:
dialog.addWindowListener(new WindowAdapter()
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
JPanel
扩展了JDialog
,因此我无法直接调用addWindowListerner
。但由于我们将对话框扩展为JDialog
,我能够调用super.addWindowListener...
并且它有效。 - rchrd