使用JavaFX创建一个实时更新的时钟程序
基于JavaFX的Timeline类与SimpleDateFormat时间格式化,实现了一个每秒自动刷新、精确到秒的实时时钟程序。时钟以"yyyy.MM.ddHH:mm:ss"格式显示在窗口右下角,通过KeyFrame定义定时任务并设置为无限循环,确保UI线程安全更新。代码结构清晰,适用于状态栏等场景。
先来看一眼最终效果:运行程序后,窗口右下角会显示一个实时更新的时间,每秒刷新一次,精确到秒。

时间格式为
yyyy.MM.dd hh:mm:ss,每秒自动更新,看着很舒服。
核心知识点
2.1 Timeline:Ja vaFX 的时间轴动画
Timeline 是 Ja vaFX 动画系统里的一个核心类,专门用来按时间线执行一系列动作。下面这张表总结了它最常用的属性和方法:
| 属性/方法 | 说明 |
|---|---|
new KeyFrame(Duration, EventHandler) | 定义关键帧:到达指定时间后执行事件 |
setCycleCount(int) | 设置循环次数,INDEFINITE 表示无限循环 |
play() | 启动动画 |
pause() | 暂停动画 |
stop() | 停止动画 |
2.2 SimpleDateFormat 时间格式化
DateFormat currentTime = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss");
常用的格式符号一览:
| 符号 | 含义 | 示例 |
|---|---|---|
yyyy | 四位年份 | 2026 |
MM | 两位月份 | 06 |
dd | 两位日期 | 13 |
HH | 24小时制 | 21 |
hh | 12小时制 | 09 |
mm | 分钟 | 49 |
ss | 秒 | 30 |
这里需要特别留个心眼:
HH是24小时制,hh是12小时制。日常显示推荐用HH,免得上下午搞混。
完整代码实现
import ja vafx.application.Application;
import ja vafx.event.ActionEvent;
import ja vafx.event.EventHandler;
import ja vafx.geometry.Insets;
import ja vafx.geometry.Pos;
import ja vafx.scene.Scene;
import ja vafx.scene.control.Label;
import ja vafx.scene.layout.BorderPane;
import ja vafx.scene.text.Font;
import ja vafx.stage.Stage;
import ja vafx.animation.KeyFrame;
import ja vafx.animation.Timeline;
import ja vafx.util.Duration;
import ja va.text.DateFormat;
import ja va.text.SimpleDateFormat;
import ja va.util.Date;
public class RealTimeClock extends Application {
@Override
public void start(Stage primaryStage) {
// 1. 创建时间标签
Label timeLabel = new Label();
timeLabel.setFont(new Font(20));
// 2. 设置时间格式
DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
// 3. 创建事件处理器:每秒更新时间
EventHandler eventHandler = e -> {
String currentTime = dateFormat.format(new Date());
timeLabel.setText(currentTime);
System.out.println(currentTime);
};
// 4. 创建 Timeline 动画
Timeline animation = new Timeline(
new KeyFrame(Duration.millis(1000), eventHandler)
);
animation.setCycleCount(Timeline.INDEFINITE);
animation.play();
// 5. 布局设置:将时间标签放在右下角
BorderPane root = new BorderPane();
root.setPadding(new Insets(20));
BorderPane.setAlignment(timeLabel, Pos.BOTTOM_RIGHT);
root.setBottom(timeLabel);
// 6. 创建场景
Scene scene = new Scene(root, 400, 300);
primaryStage.setTitle("Ja vaFX 实时时钟");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(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 的工作原理
Timeline animation = new Timeline(
new KeyFrame(Duration.millis(1000), eventHandler)
);
Duration.millis(1000):每 1000 毫秒(也就是1秒)触发一次eventHandler:每次触发时执行的更新操作setCycleCount(Timeline.INDEFINITE):无限循环,别指望它自己停
整个执行流程非常清晰:
启动 (play)
├── 等待 1000ms
├── 执行 eventHandler(更新时间)
├── 等待 1000ms
├── 执行 eventHandler(更新时间)
└── ...无限循环
5.2 为什么用 Timeline 而不是 Thread?
| 方式 | 优点 | 缺点 |
|---|---|---|
Timeline | Ja vaFX 原生支持,自动在 UI 线程更新,线程安全 | 精度受限于 Ja vaFX 帧率(通常足够用) |
Thread + sleep | 简单直观 | 需要手动调用 Platform.runLater(),容易出线程问题 |
AnimationTimer | 适合高帧率动画(比如游戏) | 每秒60次回调,用来做时钟更新有点大材小用 |
对于每秒更新一次的简单需求,
Timeline就是最简洁、最安全的选择,没有之一。
进阶:多功能时钟面板
如果你觉得只显示时间有点单调,完全可以把它跟其他功能组合在一起,比如做成一个状态栏时钟:
import ja vafx.application.Application;
import ja vafx.geometry.Insets;
import ja vafx.geometry.Pos;
import ja vafx.scene.Scene;
import ja vafx.scene.control.Label;
import ja vafx.scene.layout.HBox;
import ja vafx.scene.text.Font;
import ja vafx.scene.text.FontWeight;
import ja vafx.stage.Stage;
import ja vafx.animation.KeyFrame;
import ja vafx.animation.Timeline;
import ja vafx.util.Duration;
import ja va.text.SimpleDateFormat;
import ja va.util.Date;
public class StatusBarClock extends Application {
private Label timeLabel;
private Label statusLabel;
private int seconds = 0;
@Override
public void start(Stage primaryStage) {
// 状态标签
statusLabel = new Label("系统运行中");
statusLabel.setFont(Font.font(14));
// 时间标签
timeLabel = new Label();
timeLabel.setFont(Font.font("Consolas", FontWeight.BOLD, 16));
// 布局
HBox statusBar = new HBox(20);
statusBar.setAlignment(Pos.CENTER_RIGHT);
statusBar.setPadding(new Insets(10, 20, 10, 20));
statusBar.getChildren().addAll(statusLabel, timeLabel);
// Timeline:每秒更新
Timeline timeline = new Timeline(
new KeyFrame(Duration.seconds(1), e -> update())
);
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
Scene scene = new Scene(statusBar, 500, 50);
primaryStage.setTitle("状态栏时钟");
primaryStage.setScene(scene);
primaryStage.show();
}
private void update() {
// 更新时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
timeLabel.setText(sdf.format(new Date()));
// 顺便统计运行时长
seconds++;
if (seconds % 5 == 0) {
statusLabel.setText("已运行 " + seconds + " 秒");
}
}
public static void main(String[] args) {
launch(args);
}
}
总结
| 知识点 | 要点 |
|---|---|
| Timeline | 使用 KeyFrame 定义定时任务,INDEFINITE 无限循环 |
| SimpleDateFormat | "yyyy.MM.dd HH:mm:ss" 格式化当前时间 |
| 线程安全 | Timeline 自动在 Ja vaFX UI 线程执行,无需手动切换 |
| 字体设置 | new Font(20) 或 Font.font("Consolas", FontWeight.BOLD, 16) |
以上就是用 Ja vaFX 实现一个实时更新时钟的完整思路了。代码拿来就能跑,动手试试看吧。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















