本文目录导读:

在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 的进度数值了。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播