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
相关产品推荐
相关产品推荐

