JavaFX 实时时钟:Timeline 与动画系统入门

JavaFX 实时时钟:Timeline 与动画系统入门 一、最终效果预览运行程序后窗口右下角显示实时更新的时间每秒刷新一次时间格式为yyyy.MM.dd hh:mm:ss每秒自动更新精确到秒。二、核心知识点2.1 TimelineJavaFX 的时间轴动画Timeline是 JavaFX 动画系统的核心类用于按时间线执行一系列动作属性/方法说明new KeyFrame(Duration, EventHandler)定义关键帧到达指定时间后执行事件setCycleCount(int)设置循环次数INDEFINITE表示无限循环play()启动动画pause()暂停动画stop()停止动画2.2 SimpleDateFormat 时间格式化DateFormatcurrentTimenewSimpleDateFormat(yyyy.MM.dd hh:mm:ss);常用格式符号符号含义示例yyyy四位年份2026MM两位月份06dd两位日期13HH24小时制21hh12小时制09mm分钟49ss秒30注意HH是24小时制hh是12小时制。建议使用HH避免上午下午混淆。三、完整代码实现importjavafx.application.Application;importjavafx.event.ActionEvent;importjavafx.event.EventHandler;importjavafx.geometry.Insets;importjavafx.geometry.Pos;importjavafx.scene.Scene;importjavafx.scene.control.Label;importjavafx.scene.layout.BorderPane;importjavafx.scene.text.Font;importjavafx.stage.Stage;importjavafx.animation.KeyFrame;importjavafx.animation.Timeline;importjavafx.util.Duration;importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassRealTimeClockextendsApplication{Overridepublicvoidstart(StageprimaryStage){// 1. 创建时间标签LabeltimeLabelnewLabel();timeLabel.setFont(newFont(20));// 设置字体大小为20// 2. 设置时间格式DateFormatdateFormatnewSimpleDateFormat(yyyy.MM.dd HH:mm:ss);// 3. 创建事件处理器每秒更新时间EventHandlerActionEventeventHandlere-{StringcurrentTimedateFormat.format(newDate());timeLabel.setText(currentTime);System.out.println(currentTime);// 控制台同步输出};// 4. 创建 Timeline 动画TimelineanimationnewTimeline(newKeyFrame(Duration.millis(1000),eventHandler));animation.setCycleCount(Timeline.INDEFINITE);// 无限循环animation.play();// 启动动画// 5. 布局设置将时间标签放在右下角BorderPanerootnewBorderPane();root.setPadding(newInsets(20));BorderPane.setAlignment(timeLabel,Pos.BOTTOM_RIGHT);root.setBottom(timeLabel);// 6. 创建场景ScenescenenewScene(root,400,300);primaryStage.setTitle(JavaFX 实时时钟);primaryStage.setScene(scene);primaryStage.show();}publicstaticvoidmain(String[]args){launch(args);}}四、运行效果展示4.1 界面效果窗口右下角显示当前时间每秒自动刷新。同时控制台也会每秒打印一次时间日志。4.2 控制台输出2026.06.13 21:49:00 2026.06.13 21:49:01 2026.06.13 21:49:02 2026.06.13 21:49:03 ...五、关键代码解析5.1 Timeline 的工作原理TimelineanimationnewTimeline(newKeyFrame(Duration.millis(1000),eventHandler));Duration.millis(1000)每隔 1000 毫秒1秒触发一次eventHandler每次触发时执行的事件setCycleCount(Timeline.INDEFINITE)无限重复不会自动停止Timeline 执行流程启动 (play) ├── 等待 1000ms ├── 执行 eventHandler更新时间 ├── 等待 1000ms ├── 执行 eventHandler更新时间 └── ...无限循环5.2 为什么用 Timeline 而不是 Thread方式优点缺点TimelineJavaFX 原生支持自动在 UI 线程更新线程安全精度受限于 JavaFX 帧率Thread sleep简单直观需要手动调用Platform.runLater()更新 UI容易出错AnimationTimer适合高帧率动画如游戏每秒60次回调不适合低频更新对于每秒更新一次的需求Timeline是最简洁、最安全的选择。六、进阶多功能时钟面板将实时时间与其他功能结合打造一个更实用的状态栏importjavafx.application.Application;importjavafx.geometry.Insets;importjavafx.geometry.Pos;importjavafx.scene.Scene;importjavafx.scene.control.Label;importjavafx.scene.layout.HBox;importjavafx.scene.text.Font;importjavafx.scene.text.FontWeight;importjavafx.stage.Stage;importjavafx.animation.KeyFrame;importjavafx.animation.Timeline;importjavafx.util.Duration;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassStatusBarClockextendsApplication{privateLabeltimeLabel;privateLabelstatusLabel;privateintseconds0;Overridepublicvoidstart(StageprimaryStage){// 状态标签statusLabelnewLabel(系统运行中);statusLabel.setFont(Font.font(14));// 时间标签timeLabelnewLabel();timeLabel.setFont(Font.font(Consolas,FontWeight.BOLD,16));// 布局HBoxstatusBarnewHBox(20);statusBar.setAlignment(Pos.CENTER_RIGHT);statusBar.setPadding(newInsets(10,20,10,20));statusBar.getChildren().addAll(statusLabel,timeLabel);// Timeline每秒更新TimelinetimelinenewTimeline(newKeyFrame(Duration.seconds(1),e-update()));timeline.setCycleCount(Timeline.INDEFINITE);timeline.play();ScenescenenewScene(statusBar,500,50);primaryStage.setTitle(状态栏时钟);primaryStage.setScene(scene);primaryStage.show();}privatevoidupdate(){// 更新时间SimpleDateFormatsdfnewSimpleDateFormat(yyyy-MM-dd HH:mm:ss);timeLabel.setText(sdf.format(newDate()));// 更新运行时长seconds;if(seconds%50){statusLabel.setText(已运行 seconds 秒);}}publicstaticvoidmain(String[]args){launch(args);}}七、总结知识点要点Timeline使用KeyFrame定义定时任务INDEFINITE无限循环SimpleDateFormatyyyy.MM.dd HH:mm:ss格式化当前时间线程安全Timeline 自动在 JavaFX UI 线程执行无需手动切换字体设置new Font(20)或Font.font(Consolas, FontWeight.BOLD, 16)