您正在创建一个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(); }}


