我不太喜欢JFrame.EXIT_ON_CLOSE
选项。如果有一个线程正在写一个文件,或者下载一些东西,该选项将在它完成之前被杀死。相反,我试图通过销毁GUI窗口优雅地终止程序:
/**
* Terminates the whole program while saving settings.
*/
public void Terminate() {
//gui is JFrame representing the application window
gui.setVisible(false);
gui.dispose();
gui.destroyTray();
//Stop tool thread if running
if(ToolRunning())
StopTool();
//Save settings
if(settings==null) {
System.out.println("Settings is null!");
return;
}
try {
settings.loadSettingsFromBoundFields();
settings.saveToFile(SETTINGS_FILE, false);
}
catch(IOException e) {
System.err.println("Problem saving settings:");
e.printStackTrace(System.err);
}
//Here, no non-deamon threads should be running (daemon thread does not prolong the applicatione execution).
}
但是当我dispose()
JFrame
时,程序继续运行并且Swing线程不会退出。还有什么可以阻止Swing?当我使用相同的方法(隐藏窗口和dispose()
)创建一个更简单的程序时,它工作。这意味着我的项目的复杂性隐藏了泄露的东西。如何找到阻止Swing线程终止的内容?
答案 0 :(得分:1)
您是否尝试过此https://docs.oracle.com/javase/8/docs/api/java/awt/doc-files/AWTThreadIssues.html,即Frame.getFrames