目录
一、进度条的介绍
二、创建进度条
三、简单案例
四、子线程创建进度条
(1)为什么要使用子线程创建进度条
(2)子线程创建进度条的代码
五、创建进度对话框
(1)如何创建进度对话框
(2)案例
一、进度条的介绍
进度条是图形界面中广泛使用的GUI组件,当复制一个较大的文件时,操作系统会显示一个进度条,用于标识复制操作完成的比例;当启动Eclipse等程序时,因为需要加载较多的资源,故而启动速度较慢,程序也会在启动过程中显示一个进度条,用以表示该软件启动完成的比例......
二、创建进度条
(1)创建JProgressBar对象
JProgressBar(int o,int mi,int ma)
o:方向
mi:最小值
ma:最大(2)设置属性
setBorderPainted(boolean b)设置进度条是否有边框
setIndeterminate(boolean b)设置当前进度条是不是进度不确定的进度条,如果是,则将看到一个滑块在进度条中左右移动
setStringPainted(boolean b)设置进度条是否显示当前完成的百分比(3)获取和设置当前进度条的进度状态
setValue(int n) 设置当前进度值
double getPerecentComplete() 获取进度条的完成百分比
String getString() 返回进度字符串的当前值
三、简单案例
制作如图所示界面:
public class exer{ JFrame s=new JFrame("程序练习"); JCheckBox b1=new JCheckBox("不确定进度"); JCheckBox b2=new JCheckBox("不绘制边框"); JProgressBar bar=new JProgressBar(JProgressBar.HORIZONTAL,0,100); public void init(){ b1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取是否点击了不确定进度 boolean b=b1.isSelected(); //设置当前进度条不确定进度 bar.setIndeterminate(b); //设置是否显示当前百分比 bar.setStringPainted(!b); } }); b2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取是否选中复选框 boolean b=b2.isSelected(); bar.setBorderPainted(!b); } }); Box box1=Box.createVerticalBox(); box1.add(b1); box1.add(b2); Box box2=Box.createHorizontalBox(); box2.add(box1); box2.add(bar); s.add(box2); //开始设置默认属性 bar.setBorderPainted(true); bar.setStringPainted(true); s.setDefaultCloseOperation(3); s.pack(); s.setVisible(true); //通过循环模拟进度条 for(int i=0;i<=100;i++){ bar.setValue(i); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
四、子线程创建进度条
(1)为什么要使用子线程创建进度条
创建进度条时假如你使用的如果是主线程的话,那么其他事情你都不能做,只能等着进度条结束后才可以做其他的事,这样子用户体验性极差。所有进度条的创建我们通常使用子线程,这样子的用户体验性更好一点。
(2)子线程创建进度条的代码
public class exer{ JFrame s=new JFrame("程序练习"); JCheckBox b1=new JCheckBox("不确定进度"); JCheckBox b2=new JCheckBox("不绘制边框"); JProgressBar bar=new JProgressBar(JProgressBar.HORIZONTAL,0,100); public void init(){ b1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取是否点击了不确定进度 boolean b=b1.isSelected(); //设置当前进度条不确定进度 bar.setIndeterminate(b); //设置是否显示当前百分比 bar.setStringPainted(!b); } }); b2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取是否选中复选框 boolean b=b2.isSelected(); bar.setBorderPainted(!b); } }); Box box1=Box.createVerticalBox(); box1.add(b1); box1.add(b2); Box box2=Box.createHorizontalBox(); box2.add(box1); box2.add(bar); s.add(box2); //开始设置默认属性 bar.setBorderPainted(true); bar.setStringPainted(true); s.setDefaultCloseOperation(3); s.pack(); s.setVisible(true); //开启子线程 sim ss=new sim(bar.getMaximum()); new Thread(ss).start(); //设置一个定时任务 Timer ti=new Timer(200, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //读取线程任务对象的当前完成量,设置给进度条 int current=ss.getCurrent(); bar.setValue(current); } }); ti.start(); bar.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { if(bar.getValue()==ss.getAmount()){ ti.stop(); } } }); } private class sim implements Runnable{ //任务总量 private int amount; //记录当前完成的任务量 private volatile int current; public sim(int amount){ this.amount=amount; } public int getAmount(){ return amount; } public void setAmount(int amount){ this.amount=amount; } public void setCurrent(int current){ this.current=current; } public int getCurrent(){ return current; } @Override public void run() { while(current<100){ try { Thread.currentThread().sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } current++; } } } }
五、创建进度对话框
(1)如何创建进度对话框
ProgressMonitor的用法与JProgressBar的用法基本相似,只是ProgressMonitor可以直接创建一个进度对话框,它提供了下面的构造器完成对话框得到创建
public ProgressMonitor(Component p,Object m,String n,int mi,int ma)
p:对话框的父组件,这个父组件也可以不存在。
m:对话框的描述信息
n:进度条的提示信息
mi:进度条的最小值
ma:进度条的最大值
使用ProgressMonitor创建的对话框里包含的进度条是非常固定的,程序甚至不能设置进度条是否包含便边框(总是包含边框),不能设置进度不确定,不能改变进度条的方向(总是水平的)
(2)案例
制作如图所示界面
public class exer{ Timer t; public void init(){ ProgressMonitor monitor=new ProgressMonitor(null,"等待任务完成","已完成",0,100); sim ss=new sim(100); new Thread(ss).start(); t=new Timer(200, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //读取当前进度,设置进度条 monitor.setProgress(ss.current); //判断用户是否点击了取消按钮 if (monitor.isCanceled()==true){ t.stop(); monitor.close(); System.exit(0); } } }); t.start(); } private class sim implements Runnable{ private volatile int current=0; private int amount; public sim(int amount){ this.amount=amount; } public void setCurrent(int current){ this.current=current; } public void setAmount(int amount){ this.amount=amount; } public int getAmount(){ return amount; } public int getCurrent(){ return current; } @Override public void run() { while(current<100){ try { Thread.currentThread().sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } current++; } } } }