当JDialog是主窗口时正确关闭java程序
我有一个JDialog作为我的应用程序中的主窗口(最初它是一个JFrame,但它在任务栏中显示我不想要)。
目前我在做:
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
当我点击退出按钮时:
frame.dispose();
但这个过程似乎仍然在后台流传
JFrame有JFrame.EXIT_ON_CLOSE
,它似乎做了我想要的。
如何正确关闭我的应用程序?
你可以加
System.exit(0);
你希望程序结束的地方,也许是在dispose()行之后。
您需要添加一个WindowListener,它将在对话框关闭时执行System.exit(0)。
JDialog dialog = ...; dialog.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { System.exit(0); } });
当然,仍然需要在按下Exit按钮(在此线程的其他位置建议)之后的System.exit(0)。
考虑使用JWindow
(defalut的非decoretad),但这有点复杂的事实, JWindow
需要从JFrame
初始化(只是必须存在,没有别的)作为父
更好的是添加WindowListener
,所有事件/动作都将以这种方式重定向/管理
你知道 EXIT_ON_CLOSE
字段也是由JDialog
inheritance的,对吧?
正如@camickr所提到的, EXIT_ON_CLOSE
不是JDialog
类的setDefaultCloseOperation
方法的有效值。 如API所述,
设置当用户在此对话框上启动“关闭”时默认发生的操作。 您必须指定以下选项之一:
DO_NOTHING_ON_CLOSE
(在WindowConstants
定义):不要做任何事情; 要求程序在已注册的WindowListener对象的windowClosing方法中处理该操作。HIDE_ON_CLOSE
(在WindowConstants
定义):在调用任何已注册的WindowListener
对象后自动隐藏对话框。DISPOSE_ON_CLOSE
(在WindowConstants中定义):在调用任何已注册的WindowListener
对象后自动隐藏和DISPOSE_ON_CLOSE
对话框。
如果将EXIT_ON_CLOSE
作为参数传递,则将抛出IllegalArgumentException
。
对我来说,只使用windowClosing事件:
dialog.addWindowListener(new WindowAdapter() @Override public void windowClosing(WindowEvent e) { System.exit(0); } });
你可以尝试下面这个惊人的源代码 –
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正在运行它拥有,那么这个过程将完全终止,享受。