当前位置: 首页 > news >正文

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. 注意事项

  1. 线程安全:更新进度条的操作必须在 EDT(事件调度线程)中进行。通常使用 SwingWorker 或 invokeLater 来确保线程安全。
  2. 性能优化:频繁更新进度条可能影响界面响应性,建议设置合理的更新间隔(如每 1% 更新一次)。
  3. 异常处理:长时间运行的任务应包含异常处理逻辑,避免因错误导致进度条卡死。

 

http://www.xdnf.cn/news/942445.html

相关文章:

  • Spring AI中使用ChatMemory实现会话记忆功能
  • 算法打卡第18天
  • 【CUDA 】第5章 共享内存和常量内存——5.3减少全局内存访问(2)
  • Linux 环境配置
  • 【立体匹配】:双目立体匹配SGBM:(1)运行
  • 深入解析JavaScript构造函数与原型链
  • JavaScript 自定义对象详解
  • AI医生时代来临!o1模型在医疗诊断中超越人类医生
  • 查看进程线程的方法
  • 进制符号表示
  • 【阿里巴巴 x 浙江大学】信息与交互设计 - 信息设计漫谈
  • AIGC 基础篇 Python基础 02
  • MS8312A 车规 精密、低噪、CMOS、轨到轨输入输出运算放大器,用于传感器、条形扫描器
  • arxir网址自动转向国内镜像
  • 【DTOF传感器】光子飞行时间传感技术
  • 通信之光端机
  • 苏超 - 江苏省城市足球联赛
  • Angular中Webpack与ngx-build-plus 浅学
  • 【刷题模板】链表、堆栈
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月8日第102弹
  • 06. C#入门系列【自定义类型】:从青铜到王者的进阶之路
  • 星耀8上市品鉴暨北京中和吉晟吉利银河用户中心开业媒体见面会
  • 免费批量去水印工具 - 针对文心一言生成图片
  • DDR供电设计中的VTT与VREF作用和区别
  • leetcode Top100 189.轮转数组
  • global security market 的知识点总结 SMA
  • 给跳绳设计一双卡扣
  • Hilt在android项目中使用的注解说明
  • 设置QDialog的setModal(true)对show()无法阻塞
  • Python 训练营打卡 Day 46