Java图形化界面编程超详细知识点(7)——进度条

article/2025/11/3 15:31:48

目录

4 JProgressBar、ProgressMonitor、BoundedRangeModel实现进度条

4.1 创建进度条


4 JProgressBar、ProgressMonitor、BoundedRangeModel实现进度条

进度条是图形界面中广泛使用的GUI组件,当复制一个较大的文件时,操作系统会显示一个进度条,用于标识复制操作完成的比例。

4.1 创建进度条

使用JProgressBar创建进度条的步骤:

1.创建JProgressBar对象

public JProgressBar(int orient,int min,int max);

        orient:方向

2.设置属性

setBorderPainted(boolean b);设置进度条是否有边框

setIndeterminate(boolean newValue);设置当前进度条是不是进度不确定的进度条,如果是,则将看到一个滑块在进度条左右移动

setStringPainted(boolean b);设置进度条是否显示当前完成的百分比

3.获取和设置当前进度条的进度状态

setValue(int n);设置当前进度值

double getPercentComplete();获取进度条的完成百分比

String getString();返回进度字符串的当前值 

案例:

        使用JProgressBar完成下图效果:

public class JProgressTest {JFrame jf = new JFrame("测试进度条");JCheckBox indeterminate = new JCheckBox("不确定进度");JCheckBox noBorder = new JCheckBox("不绘制边框");//创建进度条JProgressBar bar = new JProgressBar(JProgressBar.HORIZONTAL,0,100);public void init(){//组装视图//处理复选框的点击行为indeterminate.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取一下indeterminate复选框有没有选中?boolean selected = indeterminate.isSelected();//设置当前进度条不确定进度bar.setIndeterminate(selected);bar.setStringPainted(!selected);}});noBorder.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取一下noBorder复选框有没有选中?boolean selected = noBorder.isSelected();bar.setBorderPainted(!selected);}});Box vBox = Box.createVerticalBox();vBox.add(indeterminate);vBox.add(noBorder);//设置进度条的属性bar.setStringPainted(true);bar.setBorderPainted(true);//把当前窗口的布局方式修改为FlowLayoutjf.setLayout(new FlowLayout());jf.add(vBox);jf.add(bar);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.pack();jf.setVisible(true);//通过循环模拟修改进度条的进度for (int i = 0; i <= 100; i++) {//修改已经完成的工作量,也就是百分比bar.setValue(i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {new JProgressTest().init();}
}

        这种耗时操作放在主线程的话,会导致执行耗时操作时,用户无法再进行任何操作,因此最好将耗时操作放入子线程中。

代码改进:

public class JProgressTest2 {JFrame jf = new JFrame("测试进度条");JCheckBox indeterminate = new JCheckBox("不确定进度");JCheckBox noBorder = new JCheckBox("不绘制边框");//创建进度条JProgressBar bar = new JProgressBar(JProgressBar.HORIZONTAL,0,100);public void init(){//组装视图//处理复选框的点击行为indeterminate.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取一下indeterminate复选框有没有选中?boolean selected = indeterminate.isSelected();//设置当前进度条不确定进度bar.setIndeterminate(selected);bar.setStringPainted(!selected);}});noBorder.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取一下noBorder复选框有没有选中?boolean selected = noBorder.isSelected();bar.setBorderPainted(!selected);}});Box vBox = Box.createVerticalBox();vBox.add(indeterminate);vBox.add(noBorder);//设置进度条的属性bar.setStringPainted(true);bar.setBorderPainted(true);//把当前窗口的布局方式修改为FlowLayoutjf.setLayout(new FlowLayout());jf.add(vBox);jf.add(bar);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.pack();jf.setVisible(true);//开启子线程,模拟耗时操作SimulaterActivity simulaterActivity = new SimulaterActivity(bar.getMaximum());new Thread(simulaterActivity).start();//设置一个定时任务Timer timer = new Timer(200, new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//读取线程任务对象的当前完成量,设置给进度条int current = simulaterActivity.getCurrent();bar.setValue(current);}});timer.start();//监听进度条的任务变化bar.addChangeListener(new ChangeListener() {@Overridepublic void stateChanged(ChangeEvent e) {int value = bar.getValue();if (value == simulaterActivity.getAmount()){timer.stop();}}});}private class SimulaterActivity implements  Runnable{//记录任务总量private int amount;//记录当前任务的完成量private volatile int current;public SimulaterActivity(int amount) {this.amount = amount;}public int getAmount() {return amount;}public void setAmount(int amount) {this.amount = amount;}public int getCurrent() {return current;}public void setCurrent(int current) {this.current = current;}@Overridepublic void run() {//子线程的任务  模拟耗时操作while(current<amount){try {Thread.currentThread().sleep(50);} catch (InterruptedException e) {e.printStackTrace();}current++;}}}public static void main(String[] args) {new JProgressTest2().init();}
}

        之前我们学习过,Swing中很多组件的界面与数据都采用了MVC的设计思想:

        Swing组件大都将外观显示和内部数据分离,JProgressBar也不例外,JProgressBar组件有一个内置的用于保存其状态数据的Model对象,这个对象由BoundedRangeModel对象表示,程序调用JProgressBar对象的方法完成进度百分比的设置,监听进度条的数据变化,其实都是通过它内置的BoundedRangeModel对象完成的。下面的代码是对之前代码的改进,通过BoundedRangeModel完成数据的设置,获取和监听。

public class JProgressTest3 {JFrame jf = new JFrame("测试进度条");JCheckBox indeterminate = new JCheckBox("不确定进度");JCheckBox noBorder = new JCheckBox("不绘制边框");//创建进度条JProgressBar bar = new JProgressBar(JProgressBar.HORIZONTAL,0,100);//获取处进度条内置的数据模型对象BoundedRangeModel model = bar.getModel();public void init(){//组装视图//处理复选框的点击行为indeterminate.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取一下indeterminate复选框有没有选中?boolean selected = indeterminate.isSelected();//设置当前进度条不确定进度bar.setIndeterminate(selected);bar.setStringPainted(!selected);}});noBorder.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取一下noBorder复选框有没有选中?boolean selected = noBorder.isSelected();bar.setBorderPainted(!selected);}});Box vBox = Box.createVerticalBox();vBox.add(indeterminate);vBox.add(noBorder);//设置进度条的属性bar.setStringPainted(true);bar.setBorderPainted(true);//把当前窗口的布局方式修改为FlowLayoutjf.setLayout(new FlowLayout());jf.add(vBox);jf.add(bar);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.pack();jf.setVisible(true);//开启子线程,模拟耗时操作SimulaterActivity simulaterActivity = new SimulaterActivity(bar.getMaximum());new Thread(simulaterActivity).start();//设置一个定时任务Timer timer = new Timer(200, new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//读取线程任务对象的当前完成量,设置给进度条int current = simulaterActivity.getCurrent();//bar.setValue(current);model.setValue(current);}});timer.start();//监听进度条的任务变化model.addChangeListener(new ChangeListener() {@Overridepublic void stateChanged(ChangeEvent e) {int value = model.getValue();if (value == simulaterActivity.getAmount()){timer.stop();}}});}private class SimulaterActivity implements  Runnable{//记录任务总量private int amount;//记录当前任务的完成量private volatile int current;public SimulaterActivity(int amount) {this.amount = amount;}public int getAmount() {return amount;}public void setAmount(int amount) {this.amount = amount;}public int getCurrent() {return current;}public void setCurrent(int current) {this.current = current;}@Overridepublic void run() {//子线程的任务  模拟耗时操作while(current<amount){try {Thread.currentThread().sleep(50);} catch (InterruptedException e) {e.printStackTrace();}current++;}}}public static void main(String[] args) {new JProgressTest2().init();}
}

4.2 创建进度对话框

        ProgressMonitor的用法与JProgressBar基本相似,只是ProgressMonitor可以直接创建一个进度对话框,它提供了下面的构造器完成对话框的创建:

public ProgressMonitor(Component parentcomponent,Object message,String note,int min,int max);

        parentcomponent:对话框的描述信息

        note:进度的提示信息

        使用ProgressMonitor创建的对话框里包含的进度条是非常固定的,程序甚至不能设置该进度条是否包含边框(总是包含边框),不能设置进度不确定,不能改变进度条的方向(总是水平方向)。

案例: 

        使用ProgressMonitor完成下图效果:

public class ProgressMonitorTest {Timer timer;public void init(){//创建进度对话框ProgressMonitor monitor = new ProgressMonitor(null,"等待任务完成","已完成",0,100);SimulaterActivity simulaterActivity = new SimulaterActivity(100);new Thread(simulaterActivity).start();//设置定时任务timer = new Timer(200, new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//读取当前任务量,修改进度int current = simulaterActivity.getCurrent();monitor.setProgress(current);//判断用户是否点击了取消按钮,停止定时任务,关闭对话框,退出程序if (monitor.isCanceled()){timer.stop();monitor.close();System.exit(0);}}});timer.start();}public static void main(String[] args) {new ProgressMonitorTest().init();}//定义一个线程任务,模拟耗时操作private class SimulaterActivity implements Runnable{//内存可见private volatile int current = 0;private int amount;public SimulaterActivity(int amount) {this.amount = amount;}public int getCurrent() {return current;}public void setCurrent(int current) {this.current = current;}public int getAmount() {return amount;}public void setAmount(int amount) {this.amount = amount;}@Overridepublic void run() {//通过循环,不断的修改current的值,模拟任务完成量while(current<amount){try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}current++;}}}}


http://chatgpt.dhexx.cn/article/xWXtypAI.shtml

相关文章

Java制作进度条

【效果图】 【描述】 进度条宽度保持和窗口宽度一致&#xff0c;进度最小值为0&#xff0c;最大值为100&#xff0c;每100毫秒进度值1&#xff0c;进度条中间显示进度百分比 【代码】 package test;import java.awt.*; import java.awt.event.*;import javax.swing.*;public…

QT:QGraphicsScene与QGraphicsView使用render()函数渲染图片

render()函数看官方文档&#xff0c;会有很多不懂得地方&#xff0c;以下为实践出来的效果。 当我们想要用QPaint() 绘制我们在QGraphicsView看到的部分时&#xff0c;不仅要绘制正确的图片大小&#xff0c;还需要使用 render() 渲染正确的大小。当我们只想要绘制坐标系中矩形…

Qt图形特效:QGraphicsOpacityEffect

一、描述 不透明度效果使源具有不透明度。该效果对于使源半透明非常有用&#xff0c;类似于淡入/淡出序列。可以使用setOpacity()函数修改不透明度。 二、属性成员 1、opacity : qreal。此属性保存不透明度。该值应在0.0到1.0的范围内&#xff0c;其中0.0是完全透明的&#…

图形视图(02):【类】QGraphicsScene [官翻]

文章目录 详述事件处理和传播 公共类型enum ItemIndexMethodenum SceneLayer 属性backgroundBrush: QBrushbspTreeDepth: intfocusOnTouch: boolfont: QFontforegroundBrush: QBrushitemIndexMethod: ItemIndexMethodminimumRenderSize: qrealpalette: QPalette**sceneRect**: …

Qt中使用QGraphicsScene重写drawBackGround绘制背景

Qt中使用QGraphicsScene重写drawBackGround绘制背景 需求解释 我是想这学习Qt的界面设计&#xff0c;希望能够对界面背景进行优化然后使用Qt的界面与图形画背景网格。首先查资料 通过查找博客发现很简单&#xff0c;就是新建一个类继承于QGraphicsScene&#xff0c;于是我就…

图形视图框架QGraphicsScene(场景,概念)

QGraphicsScene 该类充当 QGraphicsItems 的容器。它与 QGraphicsView 一起使用&#xff0c;用于在 2D 表面上可视化图形项目&#xff0c;例如线条、矩形、文本甚至自定义项目。 QGraphicsScene具有的功能&#xff1a; 提供用管理大量数据项的高速接口传播事件到每一个图形项…

qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

应大家的要求&#xff0c;还是把完整的工程文件贴出来&#xff0c;大家省点事&#xff1a;http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看运行效果&#xff0c;我用的群创7寸屏&#xff0c;主机是mini2440&#xff0c;分辨率是800*480&#xff0c;程序写比较粗糙…

Qt QGraphicsScene、QGraphicsView类实现仪表盘

Qt QGraphicsScene、QGraphicsView类实现仪表盘 【1】UI界面设计【2】效果【3】QGraphicsScene简介【4】QGraphicsEllipseItem简介【5】QGraphicsPolygonItem简介【6】QGraphicsLineItem简介【7】QGraphicsView简介【8】仪表源码头文件源码 【1】UI界面设计 【2】效果 【3】QGr…

qt QGraphicsScene 简单例子

坐标 graphicsView是Widget这个界面的子控件&#xff0c; 他的位置是左上角坐标为&#xff08;30,30&#xff09; 他的宽度为431&#xff0c;高度为431. 如果在graphicsView 这个子控件中&#xff0c; 继续加入 子控件A&#xff0c;由于graphicsView比较特殊。 根据它的align…

QGraphicsScene设置SceneRect

简要说明 QGraphicsScene场景区域&#xff0c;可在构造QGraphicsScene对象时设定&#xff0c;也可通过函数setSceneRect设定。QGraphicsScene场景区域中坐标原点的位置&#xff0c;会影响到图形项的坐标设定&#xff0c;进而影响图形项在场景中的显示位置。以将图片显示在中心…

QT QGraphicsScene / QGraphicsView中 sceneRect 使用详细说明

接触QT不久&#xff0c;发现QT的Graphics View框架坐标使用和平常不一样&#xff0c;尤其sceneRect的作用。 官方文档关于这部分介绍真是蛋疼&#xff0c;网上说的也寥寥。没法自己研究了一下&#xff0c;其实这块内容QT设计的很方便&#xff0c;只是文档讲解的太烂&#xff0c…

【QT】GraphicsView、QGraphicsScene、QGraphicsEllipseItem的使用

GraphicsView、QGraphicsScene、QGraphicsEllipseItem的使用 前言实验目的重构GraphicsView类新建GraphicsView、QGraphicsScene层绘制Item图形控件绘制圆形绘制矩形绘制三角形绘制文字绘制直线 组合、打散、前置和后置组合打散控件前置控件后置 绑定功能事件总结 前言 对于绘…

Qt 绘图之QGraphicsScene QGraphicsView QGraphicsItem详解

Graphics View提供了一个界面&#xff0c;它既可以管理大数量的定制2D graphical items&#xff0c;又可与它们交互&#xff0c;有一个view widget可以把这些项绘制出来&#xff0c;并支持旋转与缩放。这个柜架也包含一个事件传播结构&#xff0c;对于在scene中的这些items,它具…

PyQt5:QGraphicsScene入门一:基本介绍、场景定义、添加元素

为什么80%的码农都做不了架构师?>>> 简介说明: 这个QGraphicsScene类用于在场景中操作大量的2D图形元素,这个类是作为一个容器QGraphicsItems存在的,它是连同QGraphicsView用于可视化的二维表面的图形项目,如直线,矩形,文本,甚至定制物品;还可以有效地…

QGraphicsView,QGraphicsScene和QGraphicsItem

图形视图框架提供了一个基于图形项的模型视图编程方法&#xff0c;主要由场景、视图和图形项三部分组成&#xff0c;这三部分分别由QGraphicsScene、QGraphicsView和QGraphicsItem这三个类来表示。 场景QGraphicsScene QGraphicsScene类提供绘图场景&#xff08;Scene&#…

Qt图形视图框架:QGraphicsScene详解

一、描述 1、场景提供了一个用于管理大量2D图形项的平面。该类充当图形项的容器。 它与视图一起用于可视化2D曲面上的图形图形项。 2、场景没有自己的视觉外观&#xff0c;只负责管理图形项。 3、场景的最大优势之一就是其快速有效地定位图形项的能力。即使场景中有数百万个…

Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/117660217 长期持续带来更多项目与技术分享&#xff0c;咨询请加QQ:21497936、微信&#xff1a;yangsir198808 红胖子(红模仿)的博文大全&#xff1…

TLS、SSL原理解析

TLS、SSL https协议就是建立在TLS、SSL之上的。

SSL证书原理讲解

SSL证书原理讲解 - 2240930501 - 博客园一直以来都对数字证书的签发&#xff0c;以及信任等事情一知半解。总算有个闲适的周末来总结和深入一下相关的知识。 CA: CA(Certificate Authority)是证书的签发机构&#xff0c;它是负责管理和签发证书的https://www.cnblogs.com/dingl…

浅谈SSL/TLS工作原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 浅谈SSL/TLS工作原理 SSL对称加密非对称加密定义工作过程特点及性能分析非对称加密常用算法举例 非对称加密和对称加密各自有啥优缺点&#xff1f;CA&#xff08;Certificate…