Java Swing GUI中如何实现实时更新的计时器与倒计时功能

来源:网站主作者:湖南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《Java Swing GUI中如何实现实时更新的计时器与倒计时功能》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java Swing GUI中如何实现实时更新的计时器与倒计时功能》有用,将其分享出去将是对创作者最好的鼓励。

在Java Swing GUI开发中,实现实时更新的计时器与倒计时功能,核心是利用Swing自带的定时器类配合界面组件完成动态更新,避免手动创建线程导致界面卡顿或者更新异常的问题。

Java Swing GUI中如何实现实时更新的计时器与倒计时功能

核心实现类介绍

实现这两个功能主要用到两个核心类:

  • javax.swing.Timer:Swing提供的定时器类,会在指定间隔触发事件,并且事件处理在事件派发线程中执行,天然适配Swing组件的更新操作,不会出现跨线程更新界面的问题。
  • JLabel:用于展示计时和倒计时的实时数值,通过定时器触发事件时更新其文本内容即可实现界面刷新。

实时计时器功能实现

实时计时器的逻辑是记录开始时间,每隔固定间隔计算当前时间与开始时间的差值,转换为时分秒格式后更新到界面上。

实现步骤

  1. 初始化计时器相关变量,记录开始时间戳。
  2. 创建Swing Timer实例,设置触发间隔为1000毫秒,即每秒更新一次。
  3. 在定时器的事件处理逻辑中计算时间差,格式化后更新JLabel的内容。
  4. 添加开始、暂停、重置按钮控制计时器的运行状态。

完整代码示例

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;

public class LiveTimerFrame extends JFrame {
    // 计时开始时间戳
    private long startTime = 0;
    // 是否正在计时
    private boolean isRunning = false;
    // 显示计时的标签
    private JLabel timerLabel;
    // Swing定时器
    private Timer swingTimer;
    // 时间格式化
    private SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");

    public LiveTimerFrame() {
        setTitle("实时计时器");
        setSize(400, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout(FlowLayout.CENTER, 20, 30));

        // 初始化显示标签
        timerLabel = new JLabel("00:00:00");
        timerLabel.setFont(new Font("微软雅黑", Font.BOLD, 30));
        add(timerLabel);

        // 初始化定时器,间隔1000毫秒触发
        swingTimer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (isRunning) {
                    // 计算当前时间与开始时间的差值
                    long diff = System.currentTimeMillis() - startTime;
                    // 转换为时分秒格式
                    Date diffDate = new Date(diff);
                    timerLabel.setText(timeFormat.format(diffDate));
                }
            }
        });

        // 开始按钮
        JButton startBtn = new JButton("开始");
        startBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!isRunning) {
                    // 记录开始时间
                    startTime = System.currentTimeMillis();
                    isRunning = true;
                    swingTimer.start();
                }
            }
        });
        add(startBtn);

        // 暂停按钮
        JButton pauseBtn = new JButton("暂停");
        pauseBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (isRunning) {
                    isRunning = false;
                    swingTimer.stop();
                }
            }
        });
        add(pauseBtn);

        // 重置按钮
        JButton resetBtn = new JButton("重置");
        resetBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                isRunning = false;
                swingTimer.stop();
                timerLabel.setText("00:00:00");
                startTime = 0;
            }
        });
        add(resetBtn);
    }

    public static void main(String[] args) {
        // 在事件派发线程中创建界面
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new LiveTimerFrame().setVisible(true);
            }
        });
    }
}

倒计时功能实现

倒计时的逻辑是预先设置总时长,每隔固定间隔减少剩余时长,转换为时分秒格式更新界面,当剩余时长为0时停止定时器并提示。

实现步骤

  1. 提供输入倒计总时长的组件,比如输入框或者下拉选择。
  2. 初始化剩余时长变量,创建Swing Timer实例,间隔1000毫秒触发。
  3. 定时器事件中减少剩余时长,格式化后更新界面,剩余时长为0时停止定时器。
  4. 添加开始、暂停、重置按钮控制倒计时状态。

完整代码示例

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CountdownFrame extends JFrame {
    // 剩余时长,单位秒
    private int remainSeconds = 0;
    // 总时长,单位秒
    private int totalSeconds = 0;
    // 是否正在倒计时
    private boolean isRunning = false;
    // 显示倒计时的标签
    private JLabel countdownLabel;
    // 输入时长的输入框
    private JTextField timeInputField;
    // Swing定时器
    private Timer swingTimer;

    public CountdownFrame() {
        setTitle("倒计时功能");
        setSize(400, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));

        // 输入提示
        JLabel inputTip = new JLabel("请输入倒计时总时长(秒):");
        add(inputTip);

        // 输入框
        timeInputField = new JTextField(10);
        add(timeInputField);

        // 显示倒计时的标签
        countdownLabel = new JLabel("00:00:00");
        countdownLabel.setFont(new Font("微软雅黑", Font.BOLD, 30));
        add(countdownLabel);

        // 初始化定时器,间隔1000毫秒触发
        swingTimer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (isRunning && remainSeconds > 0) {
                    remainSeconds--;
                    // 格式化剩余时长为时分秒
                    int hours = remainSeconds / 3600;
                    int minutes = (remainSeconds % 3600) / 60;
                    int seconds = remainSeconds % 60;
                    String timeStr = String.format("%02d:%02d:%02d", hours, minutes, seconds);
                    countdownLabel.setText(timeStr);
                }
                // 剩余时长为0时停止
                if (remainSeconds == 0 && isRunning) {
                    isRunning = false;
                    swingTimer.stop();
                    JOptionPane.showMessageDialog(CountdownFrame.this, "倒计时结束!");
                }
            }
        });

        // 开始按钮
        JButton startBtn = new JButton("开始");
        startBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!isRunning) {
                    try {
                        // 获取输入的总时长
                        totalSeconds = Integer.parseInt(timeInputField.getText().trim());
                        if (totalSeconds <= 0) {
                            JOptionPane.showMessageDialog(CountdownFrame.this, "请输入大于0的时长!");
                            return;
                        }
                        remainSeconds = totalSeconds;
                        isRunning = true;
                        swingTimer.start();
                    } catch (NumberFormatException ex) {
                        JOptionPane.showMessageDialog(CountdownFrame.this, "请输入有效的数字!");
                    }
                }
            }
        });
        add(startBtn);

        // 暂停按钮
        JButton pauseBtn = new JButton("暂停");
        pauseBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (isRunning) {
                    isRunning = false;
                    swingTimer.stop();
                }
            }
        });
        add(pauseBtn);

        // 重置按钮
        JButton resetBtn = new JButton("重置");
        resetBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                isRunning = false;
                swingTimer.stop();
                remainSeconds = 0;
                countdownLabel.setText("00:00:00");
                timeInputField.setText("");
            }
        });
        add(resetBtn);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CountdownFrame().setVisible(true);
            }
        });
    }
}

功能整合与注意事项

如果需要在一个界面中同时实现计时器和倒计时功能,可以将两个功能的逻辑封装到不同的面板中,添加到同一个JFrame中即可。实现过程中需要注意以下几点:

  • 不要使用Thread.sleep()或者手动创建线程更新Swing组件,否则会导致界面卡顿甚至无响应,Swing Timer是官方推荐的定时更新方案。
  • 所有Swing组件的创建和更新都需要在事件派发线程中执行,因此主方法中要使用SwingUtilities.invokeLater
  • 时间格式化时需要注意SimpleDateFormat的线程安全问题,单线程场景下使用没有问题,多线程场景需要额外处理。
  • 倒计时的输入需要做合法性校验,避免用户输入非数字或者负数导致功能异常。
使用Swing Timer实现定时更新功能,既能够保证界面更新的线程安全,又不需要开发者手动处理线程同步问题,是Java Swing GUI中实现实时更新功能的最优选择。

Java_SwingTimer计时器倒计时GUI修改时间:2026-06-14 02:12:49

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。