Java noob在这里。当用户按下Windows关闭按钮时,扩展JDialog
的我的Swing类不会被释放 - java.exe保留在内存中。我已经将代码剥离到了这个shell,我仍然会遇到这种情况。
我看了一下其他样本,例如Basic Java Swing, how to exit and dispose of your application/JFrame
当我在该示例代码中注释掉两个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();
}
}
答案 0 :(得分:4)
您正在创建一个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();
}
}