Java noob在这里。JDialog当用户按下Windows关闭按钮时,扩展的Swing类不会处理- java.exe保留在内存中。我已经将代码剥离到了这个shell上,但我仍然可以做到这一点。
JDialog
我看了其他示例,例如Basic Java Swing,如何退出和处置您的应用程序/ JFrame。 当我注释掉System.exit(0)该示例代码中的两行时,该示例中的类仍然正确处理。我想让我的班级丢掉什么?
System.exit(0)
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(); } }