25.4.8学习总结

javaFX实现倒计时

核心概念

  1. Timeline:

    • Timeline 是JavaFX动画API的核心类,用于创建动画。它可以按照指定的时间间隔(Duration)触发事件(KeyFrame)。

    • 可以将其视为一个定时器,每隔一段时间执行一些操作。

  2. KeyFrame:

    • KeyFrame 定义了在特定的时间点要执行的操作。它包含一个 Duration 和一个 EventHandler<ActionEvent>

    • Duration 指定了从 Timeline 开始到 KeyFrame 执行的时间。

    • EventHandler<ActionEvent> 定义了在该时间点要执行的代码。

  3. Duration:

    • Duration 类用于指定时间间隔。可以指定为秒(seconds)、毫秒(millis)、纳秒(nanos)等。
  4. Label:

    • Label 用于显示倒计时的时间。可以通过 setText() 方法更新 Label 的文本内容。
  5. JavaFX Application Thread:

    • 在JavaFX应用程序中,所有的UI更新都必须在JavaFX Application Thread中进行。可以使用 Platform.runLater() 方法将代码提交到JavaFX Application Thread中执行。

代码实现

java 复制代码
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class CountdownApp extends Application {

    private static final int DEFAULT_SECONDS = 60; // 默认倒计时时长,单位秒
    private Label countdownLabel;
    private Timeline timeline;
    private int remainingSeconds = DEFAULT_SECONDS;
    private Button startButton;
    private Button stopButton;

    @Override
    public void start(Stage primaryStage) {
        countdownLabel = new Label(formatTime(remainingSeconds));
        countdownLabel.setStyle("-fx-font-size: 48px;");

        startButton = new Button("Start");
        stopButton = new Button("Stop");
        stopButton.setDisable(true); // 初始状态禁用停止按钮

        startButton.setOnAction(event -> startCountdown());
        stopButton.setOnAction(event -> stopCountdown());

        VBox root = new VBox(10, countdownLabel, startButton, stopButton);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(20));

        Scene scene = new Scene(root, 400, 300);
        primaryStage.setTitle("Countdown Timer");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void startCountdown() {
        startButton.setDisable(true);  // 禁用启动按钮
        stopButton.setDisable(false); // 启用停止按钮

        timeline = new Timeline(
            new KeyFrame(Duration.seconds(1), event -> {
                if (remainingSeconds > 0) {
                    remainingSeconds--;
                    Platform.runLater(() -> countdownLabel.setText(formatTime(remainingSeconds))); // 必须在fx线程更新UI
                } else {
                    stopCountdown();
                    Platform.runLater(() -> countdownLabel.setText("Time's up!")); // 时间到,显示 Time's up!
                }
            })
        );
        timeline.setCycleCount(remainingSeconds); // 倒计时指定次数
        timeline.setOnFinished(event -> {  //倒计时完成
            stopButton.setDisable(true);
            startButton.setDisable(false);
        });
        timeline.play();
    }

    private void stopCountdown() {
        if (timeline != null) {
            timeline.stop();
        }
        stopButton.setDisable(true);
        startButton.setDisable(false);
        remainingSeconds = DEFAULT_SECONDS;
        Platform.runLater(() -> countdownLabel.setText(formatTime(remainingSeconds)));
    }

    private String formatTime(int seconds) {
        LocalTime time = LocalTime.ofSecondOfDay(seconds);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss"); // 格式化为 时:分:秒
        return time.format(formatter);
    }

    public static void main(String[] args) {
        launch(args);
    }
}

代码解释

  • DEFAULT_SECONDS:定义默认的倒计时秒数。

  • countdownLabel:用于显示倒计时的标签。

  • timelineTimeline 对象,用于定时触发事件。

  • remainingSeconds:存储剩余秒数的整数变量。

  • startButton & stopButton: 启动/停止 倒计时按钮

  • startCountdown 方法

    • startButton.setDisable(true) & stopButton.setDisable(false):启动时启动按钮禁用,停止按钮启用

    • KeyFrame中的实现:判断 remainingSeconds > 0,否则停止倒计时,更新UI

    • timeline.setCycleCount(remainingSeconds):设置 Timeline 循环指定次数,次数等于remainingSeconds

    • timeline.setOnFinished(event -> {...}): 设置倒计时结束后的处理,例如启用/禁用 按钮

    • Platform.runLater(() -> countdownLabel.setText(...)) 使用Platform.runLater 更新UI。

  • stopCountdown 方法

    • 停止 timeline, 重置UI,重置remainingSeconds
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习