/
aleksandrazimut
/
TimerCountdownDesktop
Обзор
Документация
Войти
/
aleksandrazimut
/
TimerCountdownDesktop
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/com/timerapp/service/TimerService.java
177 строк
5 KB
Aleksandr Azimut
init commit
17 дек 2025, 21:59
17 дек 2025, 21:59
3c602f1
Код
Авторство
О чём код?
package com.timerapp.service; import com.timerapp.model.TimerState; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.util.Duration; /** * Сервис управления таймером */ public class TimerService { private int totalSeconds; // Общее время в секундах private int remainingSeconds; // Оставшееся время private TimerState state; // Текущее состояние private Timeline timeline; // JavaFX Timeline для обратного отсчета private Runnable onTick; // Callback на каждую секунду private Runnable onComplete; // Callback при завершении public TimerService() { this.state = TimerState.STOPPED; this.totalSeconds = 0; this.remainingSeconds = 0; } /** * Устанавливает время таймера * * @param seconds время в секундах */ public void setTime(int seconds) { this.totalSeconds = seconds; this.remainingSeconds = seconds; this.state = TimerState.STOPPED; } /** * Добавляет время к текущему таймеру * * @param seconds количество секунд для добавления */ public void addTime(int seconds) { this.totalSeconds += seconds; this.remainingSeconds += seconds; // Обновляем UI если есть callback if (onTick != null) { onTick.run(); } } /** * Запускает таймер */ public void start() { if (remainingSeconds <= 0) { return; } state = TimerState.RUNNING; // Создает Timeline для обратного отсчета timeline = new Timeline(new KeyFrame(Duration.seconds(1), event -> { if (remainingSeconds > 0) { remainingSeconds--; // Вызывает callback обновления if (onTick != null) { onTick.run(); } // Проверяет завершение if (remainingSeconds == 0) { state = TimerState.STOPPED; timeline.stop(); // Вызывает callback завершения if (onComplete != null) { onComplete.run(); } } } })); timeline.setCycleCount(Timeline.INDEFINITE); timeline.play(); } /** * Ставит таймер на паузу */ public void pause() { if (state == TimerState.RUNNING && timeline != null) { timeline.pause(); state = TimerState.PAUSED; } } /** * Возобновляет таймер после паузы */ public void resume() { if (state == TimerState.PAUSED && timeline != null) { timeline.play(); state = TimerState.RUNNING; } } /** * Сбрасывает таймер */ public void reset() { if (timeline != null) { timeline.stop(); } totalSeconds = 0; remainingSeconds = 0; state = TimerState.STOPPED; // Обновляет UI if (onTick != null) { onTick.run(); } } /** * Перезапускает таймер с той же длительностью */ public void restart() { if (timeline != null) { timeline.stop(); } // Сохраняет totalSeconds и перезапускаем int savedTotal = totalSeconds; remainingSeconds = savedTotal; if (savedTotal > 0) { start(); } } /** * Останавливает таймер полностью */ public void stop() { if (timeline != null) { timeline.stop(); } state = TimerState.STOPPED; } // Геттеры public int getRemainingSeconds() { return remainingSeconds; } public TimerState getState() { return state; } // Сеттеры для callbacks public void setOnTick(Runnable onTick) { this.onTick = onTick; } public void setOnComplete(Runnable onComplete) { this.onComplete = onComplete; } public int getTotalSeconds() { return totalSeconds; } public boolean isRunning() { return state == TimerState.RUNNING; } }