在Java Swing桌面应用开发中,实时时间显示和倒计时是比较常见的功能需求,比如考勤系统的时间面板、考试系统的倒计时提示等场景都需要用到。实现这两个功能的核心是利用Swing的定时器组件配合时间处理类来完成,下面详细介绍具体的实现步骤。

核心实现原理
实时时间显示和倒计时的实现都依赖javax.swing.Timer类,这个类可以按照指定的时间间隔触发动作事件,我们只需在事件处理逻辑中更新界面上的时间内容即可。实时时间需要不断获取当前系统时间并格式化展示,倒计时则需要维护一个剩余时间变量,每次触发定时器时递减并更新展示。
实时时间显示实现
步骤1:搭建基础界面
首先创建一个包含时间标签的Swing窗口,时间标签用于展示实时更新的时间内容。
import javax.swing.*;
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class RealTimeClockDemo extends JFrame {
private JLabel timeLabel;
public RealTimeClockDemo() {
// 设置窗口基本属性
setTitle("实时时间显示");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout(FlowLayout.CENTER, 20, 60));
// 初始化时间标签
timeLabel = new JLabel();
timeLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
add(timeLabel);
// 初始化定时器
initTimer();
}
private void initTimer() {
// 创建定时器,每1000毫秒(1秒)触发一次
Timer timer = new Timer(1000, e -> {
// 获取当前时间并格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = sdf.format(new Date());
// 更新标签内容
timeLabel.setText(currentTime);
});
// 启动定时器
timer.start();
}
public static void main(String[] args) {
// 在事件调度线程中运行界面
SwingUtilities.invokeLater(() -> {
RealTimeClockDemo demo = new RealTimeClockDemo();
demo.setVisible(true);
});
}
}
步骤2:代码说明
上述代码中,Timer的构造方法第一个参数是延迟时间(单位毫秒),第二个参数是事件监听器。我们设置每1秒触发一次事件,在事件处理逻辑中获取当前系统时间,使用SimpleDateFormat格式化为可读的字符串后,更新到JLabel组件中。窗口启动后就能看到时间每秒自动刷新。
倒计时功能实现
步骤1:搭建倒计时界面
倒计时功能需要额外添加开始按钮和剩余时间标签,用户可以自定义倒计时的初始时长。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CountdownDemo extends JFrame {
private JLabel countdownLabel;
private JButton startButton;
private Timer countdownTimer;
// 倒计时剩余秒数,默认60秒
private int remainingSeconds = 60;
public CountdownDemo() {
setTitle("倒计时功能");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout(FlowLayout.CENTER, 20, 50));
// 初始化倒计时标签
countdownLabel = new JLabel(formatTime(remainingSeconds));
countdownLabel.setFont(new Font("微软雅黑", Font.BOLD, 24));
add(countdownLabel);
// 初始化开始按钮
startButton = new JButton("开始倒计时");
startButton.setFont(new Font("微软雅黑", Font.PLAIN, 16));
add(startButton);
// 绑定按钮事件
initButtonEvent();
}
// 将秒数格式化为分:秒的形式
private String formatTime(int seconds) {
int minutes = seconds / 60;
int secs = seconds % 60;
return String.format("%02d:%02d", minutes, secs);
}
private void initButtonEvent() {
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 点击按钮后禁用按钮,防止重复点击
startButton.setEnabled(false);
// 初始化定时器,每1秒触发一次
countdownTimer = new Timer(1000, event -> {
remainingSeconds--;
// 更新倒计时标签
countdownLabel.setText(formatTime(remainingSeconds));
// 倒计时结束,停止定时器并提示
if (remainingSeconds <= 0) {
countdownTimer.stop();
JOptionPane.showMessageDialog(CountdownDemo.this, "倒计时结束");
// 重置剩余时间,重新启用按钮
remainingSeconds = 60;
countdownLabel.setText(formatTime(remainingSeconds));
startButton.setEnabled(true);
}
});
countdownTimer.start();
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
CountdownDemo demo = new CountdownDemo();
demo.setVisible(true);
});
}
}
步骤2:代码说明
倒计时功能的核心是维护remainingSeconds变量,每次定时器触发时将该变量减1,然后调用formatTime方法将剩余秒数转换为分:秒的格式展示。当剩余秒数小于等于0时,停止定时器并弹出提示框,同时重置倒计时状态和按钮状态,方便用户再次启动倒计时。
常见问题与优化
- 时间更新卡顿:如果定时器间隔设置过短(比如小于100毫秒),可能会导致界面卡顿,实时时间和倒计时建议间隔设置为1000毫秒即可。
- 时间格式错误:使用
SimpleDateFormat时要注意格式字符的正确性,比如HH表示24小时制的小时,hh表示12小时制的小时。 - 定时器资源释放:如果窗口关闭后定时器还在运行,需要在窗口关闭事件中调用
timer.stop()释放资源,避免内存泄漏。
功能整合示例
如果需要在一个界面中同时展示实时时间和倒计时,可以将上述两个功能的代码整合到同一个窗口类中,分别创建两个Timer实例管理各自的更新逻辑即可,两个定时器的触发间隔都设置为1000毫秒不会互相影响。
Java_Swing实时时间显示倒计时GUI开发修改时间:2026-07-11 05:36:11