本文目录导读:

在Java Swing中更新 JProgressBar 的进度数值,通常需要以下几个步骤,以下是详细说明和示例代码。
基本设置
创建并配置 JProgressBar:
JProgressBar progressBar = new JProgressBar(0, 100); // 最小值0,最大值100 progressBar.setValue(0); // 初始值 progressBar.setStringPainted(true); // 显示百分比文本
更新进度值
使用 setValue(int n) 方法更新进度:
progressBar.setValue(50); // 设置进度为50%
在后台任务中更新(推荐)
为了避免阻塞事件调度线程(EDT),应该使用 SwingWorker 或 Timer 来更新进度,SwingWorker 是最推荐的方式。
示例:使用 SwingWorker
import javax.swing.*;
import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class ProgressBarExample {
public static void main(String[] args) {
JFrame frame = new JFrame("JProgressBar 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 200);
frame.setLayout(new FlowLayout());
JProgressBar progressBar = new JProgressBar(0, 100);
progressBar.setStringPainted(true);
frame.add(progressBar);
JButton startButton = new JButton("开始任务");
frame.add(startButton);
frame.setVisible(true);
startButton.addActionListener(e -> {
// 禁用按钮,防止重复点击
startButton.setEnabled(false);
// 创建并执行 SwingWorker
SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() {
@Override
protected Void doInBackground() throws Exception {
// 模拟耗时任务
for (int i = 0; i <= 100; i++) {
Thread.sleep(50); // 模拟耗时操作
setProgress(i); // 更新进度
}
return null;
}
@Override
protected void done() {
startButton.setEnabled(true);
progressBar.setValue(100);
}
};
// 监听进度变化
worker.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
int progress = (Integer) evt.getNewValue();
progressBar.setValue(progress);
}
}
});
worker.execute(); // 启动后台线程
});
}
}
其他更新方法
方法1:使用 Timer 更新
Timer timer = new Timer(100, e -> {
int current = progressBar.getValue();
if (current < 100) {
progressBar.setValue(current + 1);
} else {
((Timer)e.getSource()).stop();
}
});
timer.start();
方法2:直接在线程中更新(不推荐,除非你知道自己在做什么)
new Thread(() -> {
for (int i = 0; i <= 100; i++) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 必须回到 EDT 更新 UI
SwingUtilities.invokeLater(() -> progressBar.setValue(i));
}
}).start();
重要注意事项
- 必须在 EDT 中更新 UI:所有 Swing 组件操作必须在事件调度线程中执行。
- SwingWorker 会自动处理进度更新在 EDT 中执行。
- 不要阻塞 EDT:长时间任务(如文件下载、计算)应该在后台线程中执行。
其他常用方法
progressBar.getMinimum(); // 获取最小值
progressBar.getMaximum(); // 获取最大值
progressBar.getValue(); // 获取当前值
progressBar.setMinimum(0);
progressBar.setMaximum(200);
progressBar.setString("加载中..."); // 自定义文本
progressBar.setIndeterminate(true); // 不确定进度模式(动画)
- 使用
setValue()更新进度 - 永远不要在 EDT 中执行耗时任务
- 推荐使用
SwingWorker+PropertyChangeListener来安全更新进度 - 如果只是简单的定时更新,可以使用
javax.swing.Timer
这样就能正确、安全地更新 JProgressBar 的进度数值了。