3 回答
TA贡献1840条经验 获得超5个赞
您可以将JFrame的默认关闭操作设置为“ DISPOSE_ON_CLOSE
”,而不是EXIT_ON_CLOSE
(为什么人们继续使用EXIT_ON_CLOSE不在我的范围内)。
如果您有任何未处置的窗口或非守护进程线程,则您的应用程序不会终止。这应该被认为是一个错误(使用System.exit解决它是一个非常糟糕的主意)。
最常见的罪魁祸首是java.util.Timer和您创建的自定义线程。两者都应设置为守护程序或必须被明确杀死。
如果要检查所有活动帧,可以使用Frame.getFrames()
。如果所有Windows /框架都已废弃,请使用调试器检查是否仍在运行任何非守护线程。
TA贡献1852条经验 获得超7个赞
我猜是EXIT_ON_CLOSE
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
before System.exit(0)更好,因为您可以在实际离开应用程序之前编写Window Listener进行一些清理操作。
该窗口侦听器允许您定义:
public void windowClosing(WindowEvent e) {
displayMessage("WindowListener method called: windowClosing.");
//A pause so user can see the message before
//the window actually closes.
ActionListener task = new ActionListener() {
boolean alreadyDisposed = false;
public void actionPerformed(ActionEvent e) {
if (frame.isDisplayable()) {
alreadyDisposed = true;
frame.dispose();
}
}
};
Timer timer = new Timer(500, task); //fire every half second
timer.setInitialDelay(2000); //first delay 2 seconds
timer.setRepeats(false);
timer.start();
}
public void windowClosed(WindowEvent e) {
//This will only be seen on standard output.
displayMessage("WindowListener method called: windowClosed.");
}
TA贡献1752条经验 获得超4个赞
可能安全的方法是这样的:
private JButton btnExit;
...
btnExit = new JButton("Quit");
btnExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
Container frame = btnExit.getParent();
do
frame = frame.getParent();
while (!(frame instanceof JFrame));
((JFrame) frame).dispose();
}
});
添加回答
举报