12.7Swing控件5 JProgressBar
Swing 进度条(JProgressBar)是用于可视化展示任务完成进度的组件,通常用于显示长时间运行任务的完成百分比。以下是关于 Swing 进度条的详细介绍:
1. 基本概念与用途
- 作用:直观展示任务完成进度,避免用户在等待时感到焦虑。
- 常见场景:文件下载、数据导入、批量处理等耗时操作。
2. 核心类与方法
Swing 进度条的核心类是 JProgressBar
,它继承自 JComponent
,主要方法包括:
-
构造方法:
JProgressBar() // 创建默认进度条(0-100) JProgressBar(int min, int max) // 指定最小值和最大值 JProgressBar(int orientation, int min, int max) // 指定方向(HORIZONTAL 或 VERTICAL)
-
进度控制:
setValue(int n) // 设置当前进度值 getValue() // 获取当前进度值 setMinimum(int min) // 设置最小值 setMaximum(int max) // 设置最大值 setIndeterminate(boolean b) // 设置为不确定模式(任务时长未知时使用)
-
外观设置:
setString(String s) // 设置进度条上的文本 setStringPainted(boolean b) // 是否显示文本 setForeground(Color c) // 设置进度条颜色 setBackground(Color c) // 设置背景色
主要属性和方法
- setValue(int n):设置当前进度值。
- setMinimum(int min) 和 setMaximum(int max):设置进度条的最小值和最大值。
- setStringPainted(boolean b):如果为
true
,则会在进度条上显示当前进度值作为文本。 - setOrientation(int orientation):改变进度条的方向,可以是
JProgressBar.HORIZONTAL
或JProgressBar.VERTICAL
。
3. 简单示例:文件下载进度条
下面是一个模拟文件下载进度的示例代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class ProgressBarExample {public static void main(String[] args) {// 创建 JFrameJFrame frame = new JFrame("文件下载进度");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(400, 200);frame.setLocationRelativeTo(null);// 创建进度条(最小值0,最大值100)JProgressBar progressBar = new JProgressBar(0, 100);progressBar.setStringPainted(true); // 显示进度百分比文本progressBar.setPreferredSize(new Dimension(300, 30));// 创建开始按钮JButton startButton = new JButton("开始下载");startButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 禁用按钮,防止重复点击startButton.setEnabled(false);// 创建并启动后台任务SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {@Overrideprotected Void doInBackground() throws Exception {// 模拟下载进度(0-100)for (int i = 0; i <= 100; i++) {// 更新进度条progressBar.setValue(i);// 模拟耗时操作Thread.sleep(100);}return null;}@Overrideprotected void done() {// 任务完成后恢复按钮状态startButton.setEnabled(true);progressBar.setString("下载完成!");}};worker.execute(); // 执行后台任务}});// 添加组件到面板JPanel panel = new JPanel();panel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 50));panel.add(progressBar);panel.add(startButton);frame.add(panel);frame.setVisible(true);}
}
4. 不确定模式(Indeterminate Mode)
当任务时长无法预估时,可以使用不确定模式:
// 创建不确定模式的进度条
JProgressBar indeterminateBar = new JProgressBar();
indeterminateBar.setIndeterminate(true); // 开启不确定模式
indeterminateBar.setString("加载中...");
indeterminateBar.setStringPainted(true);
不确定模式下,进度条会显示一个平滑移动的动画,提示用户 “任务正在进行中”。
5. 自定义外观
可以通过以下方式自定义进度条的外观:
// 设置进度条颜色
progressBar.setForeground(Color.GREEN); // 进度条颜色
progressBar.setBackground(Color.LIGHT_GRAY); // 背景色// 设置字体和文本
progressBar.setFont(new Font("Arial", Font.BOLD, 12));
progressBar.setString("处理中: " + progressBar.getValue() + "%");// 设置垂直进度条
JProgressBar verticalBar = new JProgressBar(JProgressBar.VERTICAL, 0, 100);
6. 注意事项
- 线程安全:更新进度条的操作必须在 EDT(事件调度线程)中进行。通常使用
SwingWorker
或invokeLater
来确保线程安全。 - 性能优化:频繁更新进度条可能影响界面响应性,建议设置合理的更新间隔(如每 1% 更新一次)。
- 异常处理:长时间运行的任务应包含异常处理逻辑,避免因错误导致进度条卡死。