如何修复Swing Timer七段数码管计数动画跳过0直接显示1的问题?
问题根源
你现在的代码有两个核心错误导致看不到0的显示:
- 每次
Timer触发actionPerformed回调时,你在单次回调里循环执行了0和1两个数字的渲染逻辑,单次回调内渲染完0之后立刻就被1的渲染覆盖,肉眼根本捕捉不到0的状态 - 没有初始化启动时的默认显示状态,且没有用变量记录当前的显示进度,每次回调都是重复渲染两个数字
调整方案
- 新增一个成员变量记录当前需要显示的数字,初始值设为0
- 构造函数启动定时器之前,先把初始状态0渲染出来,保证程序启动第一时间就能看到0
- 每次
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
相关产品推荐
相关产品推荐

