You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(); // 别忘了启动计时器,原代码里没写,可能也是漏了
}

关键说明

  1. 去掉while循环:我们只需要在每秒触发时做一次检查,不需要循环执行。
  2. 移除else分支的second++:保证秒数每秒只增长1次。
  3. 增加player.strength > 0的判断:避免体力已经为0后还继续扣减(出现负数)。
  4. 可选:体力归0时停止计时器,避免无效触发。

内容的提问来源于stack exchange,提问作者Lauren Millar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:50:53