Поведение по умолчанию при закрытии JFrame
просто скрывает его, а не заставляет приложение закрываться. Вам нужно позвонить:
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Другими словами: это не имеет ничего общего с ScheduledExecutorService
; Это связано с тем, что поток Event Dispatch не является потоком демона.
ДОПОЛНИТЕЛЬНЫЙ
Вместо использования ScheduledExecutorService
, который, в свою очередь, вызывает SwingUtilities.invoke...
, вам следует рассмотреть возможность использования javax.swing.Timer
, который будет периодически запускать ActionEvent
s непосредственно в потоке диспетчеризации событий , следовательно, делая ваш код проще / компактнее и избавляет от необходимости в дополнительной резьбе.
Кроме того, вы воссоздаете ImageIcon
на каждом кадре анимации, что будет очень неэффективно, особенно в тесном цикле анимации. Гораздо лучше создать его один раз при запуске приложения.