目录

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++;}}}}

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

  1. Java图形化界面编程超详细知识点(8)——列表框

    目录 5 JList.JCpmboBox实现列表框 5.1 简单列表框 5.2 不强制存储列表项的ListModel和ComboBoxMedel 5.3 强制存储列表项的DefaultListMode ...

  2. Java图形化界面编程超详细知识点(10)——Swing_表格

    目录 7 JTable.TableModel实现表格 7.1 创建简单表格 7.2 TableModel 7 JTable.TableModel实现表格 表格也是GUI程序中常用的组件,表格是一个由多 ...

  3. Java图形化界面编程超详细知识点(9)——Swing_树

    目录 6 JTree.TreeModel实现树 6.1 创建树 6.2 编辑树结点 6.3 监听结点事件 6.4 使用DefaultTreeCellRenderer改变结点外观 6.5 扩展Defau ...

  4. Java图形化界面编程

    Java图形化界面编程(使用AWT) 文章目录  内容概述  容器Container   Window   Panel   ScrollPane   Box  布局管理器   FlowLayout   ...

  5. Java图形化界面编程之——AWT

    目录 1.AWT简介 2.AWT继承体系 3.Container容器 3.1.Container继承体系 3.2.常用API 3.2.1.Component的常用方法 3.2.2.Container的 ...

  6. 双人弹球小游戏 (基于Java图形化界面编程)

    用户界面如下 : 玩法:双方玩家可以分别控制A-D键和←-→键来进行各自球拍的位置,如果某方没有接住小球,则对方获胜,游戏结束. 代码如下: import javax.swing.*; import ...

  7. Java 图形化界面编程(Swing)入门实例

    本文目录 入门实例 先整一个图形化界面出来 常用布局 流式布局 网格布局 边界布局 边界布局 四个入门实例(附截图) 一个小demo(单词计数) 一个较为完整的demo Java (Swing)文件版 ...

  8. java 图形化界面编程--awt编程

    二. AWT 编程 2.1 AWT简介 ​ 当 JDK 1.0发布时, Sun 提供了 一套基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行 , 这套基本类库被称为"抽象窗口工具 ...

  9. Java图形化界面设计——容器(JFrame)

    Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...

最新文章

  1. 与跨国巨头合作,做羊还是做狼? --- 我看SAP取消HAND合作伙伴资格
  2. ServiceStack.OrmLite使用
  3. 深入JVM彻底剖析前面ygc越来越慢的case
  4. POJ-1789 Truck History 最小生成树
  5. blockhouses
  6. hacktoberfest_我第一次参加Hacktoberfest中学到了什么
  7. 安装配置opensips过程记录
  8. Python核心编程-细节
  9. Warning:java: 来自注释处理程序 'org.antlr.v4.runtime.misc.NullUsageProcessor' 的受支持 source 版本 'RELEASE_6' 低于
  10. linux 网络块存储,网络存储集群
  11. Unity3d 新建xml 读取xml
  12. java.lang.Runtime.availableProcessors返回可用处理器的Java虚拟机的数量
  13. 将Fortran程序转化成大写[cwp]
  14. 转帖一篇关于DELPHI调试的文章-AQTime
  15. php url 合法字符串_PHP函数补完:http_build_query()构造URL字符串
  16. Codeforces 208A:Dubstep(字符串)
  17. 经典路径规划算法分类概述(更新中)
  18. 【数据结构C++】哈希表(三)
  19. 卡通人物设计_40个很棒的卡通人物设计教程
  20. 小呆聚合支付系统免签约即时到账多商户支付系统v6.5+监控软件+教程

热门文章

  1. scratch案例——小猫钓鱼
  2. 下载yutube视频的方法 超方便
  3. 西北工业大学惨遭境外黑客攻击!国防七子可不是盖的!
  4. lammps教程:lj/cut力场使用方法
  5. jquery 实现 图片放大
  6. 专业冷门、院校双非,汇智动力带出17K高薪的测试学员
  7. 在冷风中我凌乱了半小时,只因健康码刷不出来
  8. 图书资源下载网站收集
  9. db+Nacos的方式部署高可用集群模式
  10. 2022年转行实录:有人3个月从2.5k到15k,有人转错行一生瞎忙