Java图形化界面编程超详细知识点(7)——进度条
目录
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)——进度条相关推荐
- Java图形化界面编程超详细知识点(8)——列表框
目录 5 JList.JCpmboBox实现列表框 5.1 简单列表框 5.2 不强制存储列表项的ListModel和ComboBoxMedel 5.3 强制存储列表项的DefaultListMode ...
- Java图形化界面编程超详细知识点(10)——Swing_表格
目录 7 JTable.TableModel实现表格 7.1 创建简单表格 7.2 TableModel 7 JTable.TableModel实现表格 表格也是GUI程序中常用的组件,表格是一个由多 ...
- Java图形化界面编程超详细知识点(9)——Swing_树
目录 6 JTree.TreeModel实现树 6.1 创建树 6.2 编辑树结点 6.3 监听结点事件 6.4 使用DefaultTreeCellRenderer改变结点外观 6.5 扩展Defau ...
- Java图形化界面编程
Java图形化界面编程(使用AWT) 文章目录 内容概述 容器Container Window Panel ScrollPane Box 布局管理器 FlowLayout ...
- Java图形化界面编程之——AWT
目录 1.AWT简介 2.AWT继承体系 3.Container容器 3.1.Container继承体系 3.2.常用API 3.2.1.Component的常用方法 3.2.2.Container的 ...
- 双人弹球小游戏 (基于Java图形化界面编程)
用户界面如下 : 玩法:双方玩家可以分别控制A-D键和←-→键来进行各自球拍的位置,如果某方没有接住小球,则对方获胜,游戏结束. 代码如下: import javax.swing.*; import ...
- Java 图形化界面编程(Swing)入门实例
本文目录 入门实例 先整一个图形化界面出来 常用布局 流式布局 网格布局 边界布局 边界布局 四个入门实例(附截图) 一个小demo(单词计数) 一个较为完整的demo Java (Swing)文件版 ...
- java 图形化界面编程--awt编程
二. AWT 编程 2.1 AWT简介 当 JDK 1.0发布时, Sun 提供了 一套基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行 , 这套基本类库被称为"抽象窗口工具 ...
- Java图形化界面设计——容器(JFrame)
Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...
最新文章
- 与跨国巨头合作,做羊还是做狼? --- 我看SAP取消HAND合作伙伴资格
- ServiceStack.OrmLite使用
- 深入JVM彻底剖析前面ygc越来越慢的case
- POJ-1789 Truck History 最小生成树
- blockhouses
- hacktoberfest_我第一次参加Hacktoberfest中学到了什么
- 安装配置opensips过程记录
- Python核心编程-细节
- Warning:java: 来自注释处理程序 'org.antlr.v4.runtime.misc.NullUsageProcessor' 的受支持 source 版本 'RELEASE_6' 低于
- linux 网络块存储,网络存储集群
- Unity3d 新建xml 读取xml
- java.lang.Runtime.availableProcessors返回可用处理器的Java虚拟机的数量
- 将Fortran程序转化成大写[cwp]
- 转帖一篇关于DELPHI调试的文章-AQTime
- php url 合法字符串_PHP函数补完:http_build_query()构造URL字符串
- Codeforces 208A:Dubstep(字符串)
- 经典路径规划算法分类概述(更新中)
- 【数据结构C++】哈希表(三)
- 卡通人物设计_40个很棒的卡通人物设计教程
- 小呆聚合支付系统免签约即时到账多商户支付系统v6.5+监控软件+教程