Таймер свинга
Вы хотите использовать таймер качания (javax.swing.Timer
) вместо обычного таймера (java.util.Timer
). См. Oracle Tutorial .
Автоматическая заправка
Особенностью Swing Timer является то, что он автоматически обрабатывает тиканье таймера на фоне, а при его срабатывании таймер автоматически обрабатывает выполнение вашей задачи в главном потоке графического интерфейса Swing. Так что вам не нужно заботиться о деталях потоков.
очень и очень важно никогда не получать доступ к графическим интерфейсам виджетов в фоновом потоке. Вы можете сойти с рук, или вы можете резко разрушить ваше приложение. Таймер Swing был изобретен для выполнения рутинной работы по обратному отсчету в фоновом потоке, при этом переключаясь обратно в поток GUI для выполнения кода задачи.
TimerTask
, чтобы закрыть приложение
Напишите свою работу, которая будет выполняться при срабатывании таймера, как java.util.TimerTask
.
Алгоритм
Таймер Swing может срабатывать один или несколько раз. Вы хотите стрелять один раз. После запуска закройте ваше приложение.
Установите таймер при запуске вашего приложения. Сохраните ссылку на этот таймер в вашем приложении. Настройте таймер для желаемого 2-минутного обратного отсчета. Каждый раз, когда мышь двигается, вызовите restart
на таймере качания. Таким образом, 2-минутный отсчет продолжает возвращаться к 2 минутам. Ваше приложение может работать часами, а 2-минутный таймер сбрасывается снова и снова.
launch timer (2 mins) → on mouse move ↓ → timer fires → shutdown app
↑ ← restart timer ←
Завершение работы или перезапуск
Когда отсчет истекает, я не уверен, что вы намеревались завершить работу, перезапустить или просто повторно инициализировать какое-то состояние в вашем приложении. Если последний (состояние повторной инициализации), установите таймер на срабатывание несколько раз, а не один раз. Остальная часть подхода остается прежней.
Возможна оптимизация
Не знаю наверняка, но я подозреваю, что сброс таймера на при каждом перемещении мыши может быть излишним и может стоить немного производительности. Профиль, чтобы увидеть для себя. Если это кажется значительным, просто отследите последний раз, когда вы сбрасывали таймер. Чтобы отследить этот момент, используйте объект Instant
. Звоните Instant.now()
, чтобы зафиксировать текущий момент при каждом движении мыши. Рассчитайте прошедшее время с помощью Duration.between
. Когда продолжительность превышает произвольный предел, скажем, 5 секунд, перезапустите таймер Swing и обновите «когда последний раз таймер перезапустился» Instant
, который вы храните. Instant.now
фиксирует текущий момент с разрешением миллисекунды в Java 8 и разрешением микросекунды в Java 9 и более поздних версиях. (Instant
на самом деле содержит наносекунд , но обычные компьютерные часы не могут работать так хорошо.)