Найти в Дзене
yagdmitrij

Обзор класса Timer из пакета javax.swing

В этой статье рассмотрим класс 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() – перезапускает таймер; Попробуем остановить таймер перед крутым

В этой статье рассмотрим класс 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) - Включает или отключает журнал таймера. Если этот параметр включен, при каждом срабатывании таймера в консоли будет публиковаться сообщение.

Немного оптимизируем программу, в частности, улучшим обработку событий. Теперь запуск таймера – щелчок мышью, а перезапуск – нажатие мышью.

setLogTimers(boolean flag)
setLogTimers(boolean flag)

public static boolean getLogTimers() - Возвращает, true если включено ведение журнала, в противном случае – false.

public void setDelay (int delay) – Задаёт задержку между событиями (время между двумя последовательными событиями действия). Это не влияет на начальную задержку, которую можно задать с помощью метода setInitialDelay.

Параметры: delay- задержка в миллисекундах

По сути это равнозначно, если бы мы изменяли первый параметр в конструкторе.

setDelay (int delay)
setDelay (int delay)

public int getDelay () - Возвращает задержку в миллисекундах между срабатыванием событий действия.

public void setInitialDelay (int initialDelay) - Задаёт начальную задержку — время в миллисекундах, которое должно пройти после запуска таймера до срабатывания первого события. При создании это значение устанавливается равным задержке между событиями, но затем его значение становится независимым и не зависит от изменений задержки между событиями.

Параметры:

initialDelay- начальная задержка, в миллисекундах.

Здесь таймер стартует не сразу, а с некоторой задержкой (initialDelay).

setInitialDelay (int initialDelay)
setInitialDelay (int 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. Подписчикам предоставлю ссылку на исходники по запросу на эл. почту ( в описании канала) и др. дополнительный материал.

Ставьте лайки, подписывайтесь на канал и вас ждет масса интересных статей по программированию.

моя телега