Вы должны избавиться от фрейма, вызвав метод dispose в вашем обработчике окон или используя setDefaultCloseOperation. Для аргумента последнего вы можете использовать две опции:
DISPOSE_ON_CLOSE
или EXIT_ON_CLOSE
.
DISPOSE_ON_CLOSE
распоряжаться только ресурсами фрейма.
EXIT_ON_CLOSE
располагает ресурсы фрейма и затем вызывает System.exit
.
Нет реальной разницы между этими двумя, если у вас нет потоков, не являющихся демонами.
Я предпочитаю использовать DISPOSE_ON_CLOSE
, потому что таким образом я могу заметить, что я забыл прекратить поток, потому что JVM остановится, если не будет больше запущенных потоков. По этой же причине закрытие Frame без удаления не приведет к завершению приложения, поскольку Swing создает поток для обработки событий, которые завершаются только при вызове dispose.