Java Swing定时器实现每10秒减2体力异常问题求助
问题排查与解决
核心问题分析
你的代码里有两个致命逻辑错误:
- 不该用
while循环:actionPerformed是Swing计时器每秒触发一次的方法,你在这里加了while(player.strength > 0),会导致单次触发时,代码直接进入死循环,疯狂自增second并扣减体力,直到体力归0才停止,这就是为什么秒数直接跳到11、体力瞬间清零的原因。 - 多余的
second++:方法开头已经对second自增了一次,else分支里又加了一次,这会让秒数增长速度翻倍,进一步加剧问题。
修正后的代码
public void simpleTimer(){ //creates a timer timer = new javax.swing.Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ second++; counterLabel.setText("" + second); //displays the time increasing // 只在秒数是10的倍数且体力大于0时扣减 if (second % 10 == 0 && player.strength > 0) { player.strength -= 2; // 简化写法 StrengthLabelNumber.setText("" + player.strength); // 如果体力归0,可以在这里停止计时器 if(player.strength <= 0){ timer.stop(); } } } }); timer.start(); // 别忘了启动计时器,原代码里没写,可能也是漏了 }
关键说明
- 去掉
while循环:我们只需要在每秒触发时做一次检查,不需要循环执行。 - 移除
else分支的second++:保证秒数每秒只增长1次。 - 增加
player.strength > 0的判断:避免体力已经为0后还继续扣减(出现负数)。 - 可选:体力归0时停止计时器,避免无效触发。
内容的提问来源于stack exchange,提问作者Lauren Millar
相关产品推荐
相关产品推荐

