Java对话框没有处理

Java noob在这里。 扩展JDialog我的Swing类在用户按下Windows关闭按钮时不会处置 – java.exe保留在内存中。 我已经将代码剥离到这个shell,我仍然得到这种行为。

我查看了其他示例,例如Basic Java Swing,如何退出和处理您的应用程序/ JFrame
当我在该示例代码中注释掉两个System.exit(0) ,该示例中的类仍然正确处理。 我错过了什么让我的class级处理?

 import javax.swing.JFrame; import javax.swing.JDialog; public class WhyNoDispose extends JDialog{ public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { try { WhyNoDispose frame = new WhyNoDispose("my title"); frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); frame.setVisible(true); //System.exit(0); } catch (Exception e) { e.printStackTrace(); } } }); } public WhyNoDispose(String title) { super(new JFrame(title), ModalityType.APPLICATION_MODAL); pack(); } } 

您正在创建一个JFrame,并且从不在此处理它:

 public WhyNoDispose(String title) { super(new JFrame(title), ModalityType.APPLICATION_MODAL); // ********* pack(); } 

因此,由于JFrame处于活动状态且已呈现GUI,因此Swing事件线程继续运行。

如果您改为使JFrame运行以便程序退出JFrame关闭,然后显式处理JFrame,您的程序现在退出:

 import java.awt.Window; import javax.swing.JFrame; import javax.swing.JDialog; public class WhyNoDispose extends JDialog { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { try { WhyNoDispose frame = new WhyNoDispose("my title"); frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); JFrame win = (JFrame) frame.getOwner(); win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); win.dispose(); // System.exit(0); } catch (Exception e) { e.printStackTrace(); } } }); } public WhyNoDispose(String title) { super(new JFrame(title), ModalityType.APPLICATION_MODAL); pack(); } } 

但至少可以说这是非常复杂的代码 – 如果拥有的窗口不是JFrame怎么办? 如果它是空的怎么办?

另一个解决方案是根本不使用JFrame,这样当处理JDialog时,没有剩余的持久窗口使事件线程持久化:

 import java.awt.Window; import javax.swing.JFrame; import javax.swing.JDialog; public class WhyNoDispose extends JDialog { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { try { WhyNoDispose frame = new WhyNoDispose("my title"); frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public WhyNoDispose(String title) { super((JFrame)null, title); pack(); } }