Мне не очень нравится опция JFrame.EXIT_ON_CLOSE
. Если есть нить, пишущая файл, или загрузка чего-либо, этот вариант будет убит до его завершения. Вместо этого я пытался завершать программу, уничтожив окно GUI:Как избежать JFrame.EXIT_ON_CLOSE и изящно завершить программу качания
/**
* 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
. Что еще может блокировать Свинг? Когда я сделал более простую программу, используя тот же подход (скрыть окно и dispose()
), он сработал. Это означает, что сложность моего проекта скрывает то, что просочилось. Как я могу найти то, что блокирует потоки Swing от завершения?
SetVisible (ложь) == Dispose(), если JVM еще жив – mKorbel
попробовать WindowListener/Государство/e.i. – mKorbel
1. (Нет ... мета много раз.) Мы не являемся справочным столом, 2. (чтобы избежать неправильных ответов здесь) есть два типа процессов, которые вам нужно будет завершить/закрыть() deamon и non_deamon темы, 3. Как я могу найти, что блокирует потоки Swing от завершения? - JProfiler показывает вам все беспорядок, который не завершается/закрывается() во время выполнения, вкл. class/void/variable name/inheritance или их вложенный объект API – mKorbel