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

Java Swing使用Timer实现进度条 解决重复点击导致进度加速问题咨询

问题修复方案

核心原因

当前代码每次触发按钮点击事件都会创建一个全新的Timer实例并启动,多个Timer并行按50ms间隔触发累加逻辑,进度条值会被多个Timer同时累加,自然会出现增长速度随点击次数翻倍的问题。

解决方案1:复用Timer实例,避免重复启动

将Timer定义为类的成员变量,点击时先判断Timer是否处于运行状态,仅未运行时才初始化/启动,从逻辑上杜绝多Timer并行:
首先在类中添加成员变量声明:

// 类成员变量,全局复用同一个进度条Timer
private Timer progressTimer;

修改按钮点击事件逻辑:

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
    // Timer运行中直接忽略本次点击
    if (progressTimer != null && progressTimer.isRunning()) {
        return;
    }
    // 如果需要每次点击都从头开始加载进度,可保留此行;如果要续接之前的进度则删除
    jProgressBar1.setValue(0);
    progressTimer = new Timer(50, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            jProgressBar1.setValue(jProgressBar1.getValue() + 1);
            if (jProgressBar1.getValue() == 100) {
                ((Timer) e.getSource()).stop();
            }
        }
    });
    progressTimer.start();
}

解决方案2:交互层面禁用重复点击

点击按钮后立刻禁用按钮,等进度条加载完成再恢复按钮可用状态,从操作层面彻底避免重复触发,逻辑更简单直观:

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
    // 点击后立刻禁用按钮,禁止重复点击
    jButton1.setEnabled(false);
    // 重置进度条为0,从头开始加载
    jProgressBar1.setValue(0);
    final Timer t = new Timer(50, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            jProgressBar1.setValue(jProgressBar1.getValue() + 1);
            if (jProgressBar1.getValue() == 100) {
                ((Timer) e.getSource()).stop();
                // 进度加载完成后恢复按钮可用
                jButton1.setEnabled(true);
            }
        }
    });
    t.start();
}

两种方案可以单独使用,也可以结合使用进一步提升稳定性。

内容的提问来源于stack exchange,提问作者Islah Amine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:24:02