Swing Timer
НЕ является TimerTask
, вместо этого вам нужно просто stop
Timer
... сказав, что в вашем коде есть так много вещей, которые просто пугают меня, это не смешно.
Сначала рассмотрим Как использовать Swing Timers и JavaDocs для Swing Timer
. Метод, который вы ищете, это stop
. Чтобы позвонить, вам понадобится ссылка на саму Timer
.
Один из способов сделать это - извлечь ссылку Timer
из ActionEvent
из ActionListener
, зарегистрированного в Timer
Timer timer = (Timer)evt.getSource();
Поскольку вы находитесь в Swing, вам необходимо прекратить использование TimerTask
, Swing НЕ является потокобезопасным, и вам не следует пытаться обновлять пользовательский интерфейс вне контекста потока диспетчеризации событий - посмотрите на Параллельность в Swing для более подробной информации.
Graphics g = JPanel1.getGraphics();
Это одновременно опасно и плохо. getGraphics
может вернуть null
, и в лучшем случае это просто снимок последнего цикла рисования. Все, что вы пытаетесь нарисовать, будет стерто в следующем цикле рисования.
Остановись, иди и прочитай Выполнение пользовательской рисования и Рисование в AWT и Swing , чтобы лучше понять, как работает рисование в Swing и как с ним работать.
Кажется, вы просто подключаете столько кода к своей проблеме в какой-то тщетной попытке ее решить, а скорее понимаете доступные вам API и то, как вы должны их использовать. Возможно, вам придется разбить вашу проблему на небольшие куски, с которыми вы можете поиграть и попытаться решить их изолированно, и, как только вы поймете, как они работают, объедините их в более масштабное решение