В этой статье рассмотрим класс Timer, который входит в пакет javax.swing. Не путать с классом Timer, входящий в другой пакет java.util. По сути это таймер, предназначенный для генерации событий ActionEvent через заданные промежутки времени. С помощью данного класса можно реализовать, например, движение графического объекта. Рассмотрим его особенности, синтаксис и типичные сценарии использования. Методов не так много, поэтому рассмотрим почти все. Для начала реализуем с помощью Timer движение объекта.
Листаем галерею:
конструктор:
Timer timer=new Timer(int delay, ActionListener listener);
delay – задержка в миллисекундах между срабатываниями
listener – объект, реализующий интерфейс ActionListener, чей метод actionPerformed(ActionEvent e) будет вызван по истечении таймера.
методы:
public void start() - запускает таймер. Мы уже выше это делали timer.start().
public void stop() – останавливает таймер;
public void restart() – перезапускает таймер;
Попробуем остановить таймер перед крутым спуском синего круга, а затем перезапустить его, когда, например, выполним перемещение окна, что и пропишем в обработчике.
public void addActionListener(ActionListener listener) – Добавляет слушатель в таймер.
Параметры: listener- слушатель для добавления.
public void removeActionListener(ActionListener listener) - Удаляет указанный слушатель из таймера.
Параметры:
listener - слушатель для удаления
public ActionListener [] getActionListeners () - Возвращает массив всех слушателей, зарегистрированных на этом таймере. Или пустой массив, если в данный момент не зарегистрировано ни одного слушателя.
Смотрим работу методов, листая галерею:
public static void setLogTimers(boolean flag) - Включает или отключает журнал таймера. Если этот параметр включен, при каждом срабатывании таймера в консоли будет публиковаться сообщение.
Немного оптимизируем программу, в частности, улучшим обработку событий. Теперь запуск таймера – щелчок мышью, а перезапуск – нажатие мышью.
public static boolean getLogTimers() - Возвращает, true если включено ведение журнала, в противном случае – false.
public void setDelay (int delay) – Задаёт задержку между событиями (время между двумя последовательными событиями действия). Это не влияет на начальную задержку, которую можно задать с помощью метода setInitialDelay.
Параметры: delay- задержка в миллисекундах
По сути это равнозначно, если бы мы изменяли первый параметр в конструкторе.
public int getDelay () - Возвращает задержку в миллисекундах между срабатыванием событий действия.
public void setInitialDelay (int initialDelay) - Задаёт начальную задержку — время в миллисекундах, которое должно пройти после запуска таймера до срабатывания первого события. При создании это значение устанавливается равным задержке между событиями, но затем его значение становится независимым и не зависит от изменений задержки между событиями.
Параметры:
initialDelay- начальная задержка, в миллисекундах.
Здесь таймер стартует не сразу, а с некоторой задержкой (initialDelay).
public int getInitialDelay ()- Возвращает начальную задержку.
public void setRepeats(boolean flag)
true - многократное срабатывание (по умолчанию);
false – таймер сработает один раз и остановится.
Посмотрим, как работает этот метод. Для этого нам нужно вывести переменную в консоль, которая увеличивается на единицу с каждым циклом срабатывания таймера, чтобы мы могли визуально за этим наблюдать. Листаем галерею:
public boolean isRepeats () – проверяет срабатывание таймера.
true – многократное срабатывание (по умолчанию);
false – однократное срабатывание.
public void setCoalesce(boolean flag)
true – (по умолчанию)если события накапливаются, то таймер их объединяет в одно;
false – запрещает объединение событий.
public boolean isCoalesce () – проверяет режим объединения событий таймера.
return: true – таймер объединяет события;
false – таймер не объединяет
public void setActionCommand(String command) – задает строку-команду, которая будет передана в ActivEvent. Рассмотрим это все на гифке. Передадим строковую команду в ActivEvent «стоп», и далее через «IF» реализуем остановку таймера.
public String getActionCommand() – возвращает строковую команду, которая была предана в ActivEvent.
public boolean isRunning () – проверяет запущен ли таймер.
true – запущен;
false – не запущен.
Основные достоинства Java Timer
1. Поток выполнения: все действия выполняются в потоке диспетчеризации событий, что исключает проблемы с безопасностью потоков при изменении компонентов интерфейса.
2. Периодичность: можно задать фиксированный интервал между срабатываниями.
3. Однократное или повторяющееся выполнение: таймер может сработать один раз или циклически.
4. Простое управление: методы start(), stop(), restart() позволяют гибко контролировать жизненный цикл таймера.
Где можно использовать библиотеку Timer
Библиотека javax.swing.Timer особенно полезна в следующих сценариях:
Анимации в Swing-приложениях: плавное перемещение компонентов, мигание, переходы.
Индикаторы прогресса: обновление полосы прогресса или текстовой метки.
Автосохранение: периодическое сохранение данных без блокировки интерфейса.
Таймеры обратного отсчёта: например, для тестов или игр.
Опросы состояния: периодическая проверка внешних ресурсов с обновлением GUI.
Типичные ошибки, с которыми можно столкнуться при написании программы:
1. Если объявить Timer timer = new Timer(...) внутри метода, его нельзя будет остановить извне. Нужно делать поле класса:
private Timer timer;
2. Длительные операции в actionPerformed.
Не делайте тяжёлые вычисления в обработчике — это заблокирует интерфейс. Используйте SwingWorker для фоновых задач.
3. Незакрытые таймеры.
Всегда вызывайте timer.stop() при закрытии окна или компонента, чтобы избежать утечек памяти.
Класс javax.swing.Timer — удобный и безопасный инструмент для реализации периодических действий в Java приложениях с графическим интерфейсом. Благодаря работе в потоке диспетчеризации событий он позволяет без лишних усилий обновлять компоненты Swing по таймеру. Зная особенности java Timer и возможности библиотеки Timer, разработчик может эффективно решать типовые задачи GUI программирования, избегая проблем с потоками и синхронизацией.
На этом все по данному обзору на класс Timer. Подписчикам предоставлю ссылку на исходники по запросу на эл. почту ( в описании канала) и др. дополнительный материал.
Ставьте лайки, подписывайтесь на канал и вас ждет масса интересных статей по программированию.
моя телега