当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字段也是由JDialoginheritance的,对吧?

正如@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正在运行它拥有,那么这个过程将完全终止,享受。