You need to enable JavaScript to run this app. 如何修复Swing Timer七段数码管计数动画跳过0直接显示1的问题?
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Swing Timer七段数码管计数动画跳过0直接显示1的问题?

问题根源

你现在的代码有两个核心错误导致看不到0的显示:

  • 每次Timer触发actionPerformed回调时,你在单次回调里循环执行了0和1两个数字的渲染逻辑,单次回调内渲染完0之后立刻就被1的渲染覆盖,肉眼根本捕捉不到0的状态
  • 没有初始化启动时的默认显示状态,且没有用变量记录当前的显示进度,每次回调都是重复渲染两个数字

调整方案

  1. 新增一个成员变量记录当前需要显示的数字,初始值设为0
  2. 构造函数启动定时器之前,先把初始状态0渲染出来,保证程序启动第一时间就能看到0
  3. 每次actionPerformed触发时,只渲染当前计数器对应的数字,渲染完成后给计数器+1,计数器到2的时候就停掉定时器即可

修改后的参考代码如下:

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

public class SevenSegment extends JFrame {
    Timer timer = new Timer(1000, null);
    // 新增计数器记录当前显示的数字,初始为0
    int currentNum = 0;
    // 提前定义好两个数字的段配置,不用每次回调重复创建
    JLabel[][] zero = {{lblOne, lblTwo, lblThree, lblFour, lblFive, lblSix},{lblSeven}};
    JLabel[][] one = {{lblFive, lblSix}, {lblOne, lblTwo, lblThree, lblFour, lblSeven}};

    public SevenSegment() {
        // 先渲染初始状态0,保证启动就显示0
        renderNum(0);
        // 给定时器加监听
        timer.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                currentNum++;
                if (currentNum >= 2) {
                    // 到1之后就停止定时器,不需要继续跑
                    timer.stop();
                    return;
                }
                // 只渲染当前的数字
                renderNum(currentNum);
            }
        });
        // 最后启动定时器,1秒后触发第一次回调切换到1
        timer.start();
    }

    // 抽离公共的渲染方法,避免重复代码
    private void renderNum(int num) {
        JLabel[][] config = num == 0 ? zero : one;
        // 点亮对应段
        for (JLabel label : config[0]) {
            label.setBackground(Color.RED);
        }
        // 熄灭不显示的段
        for (JLabel label : config[1]) {
            label.setBackground(Color.WHITE);
        }
    }
}

额外说明

如果后续需要扩展显示更多数字,只需要新增对应数字的段配置,再修改计数器的上限即可。

内容的提问来源于stack exchange,提问作者Tomoya Suto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 23:54:04