首页 > 代码库 > 第12章-Swing编程 --- 使用JProgressBar、ProgressMonitor和BoundedRangeModel创建进度条
第12章-Swing编程 --- 使用JProgressBar、ProgressMonitor和BoundedRangeModel创建进度条
第12章-Swing编程 --- 使用JProgressBar、ProgressMonitor和BoundedRangeModel创建进度条
(一)创建进度条
使用JProgressBar,可以很方便的创建进度条,其步骤如下:
(1)创建一个JProgressBar对象,创建该对象时也可以指定3个参数,用于设置进度条的排列方向(竖直和水平)、进度条的最大值和最小值。也可以在创建该对象时不传入任何参数,而是在后面程序中修改这3个属性。
下面代码创建了JProgressBar对象
//创建一条垂直进度条 JProgressBar bar = new JProgressBar(JProgressBar.VERTICAL);
(2)调用该对象的常用方法设置进度条的普通属性。JProgressBar除了提供设置排列方向、最大值、最小值的setter和getter方法之外,还提供了如下3个方法:
1. setBorderPainted(boolean b):设置该进度条是否使用边框。
2. setIndeterminate(boolean newValue):设置该进度条是否是进度不确定的进度条,如果指定一个进度条的进度不确定,将看到一个滑块在进度条中左右移动。
3. setStringPainted(boolean newValue):设置是否在进度条中显示完成百分比 。
(3)当程序中工作进度改变时,调用JProgressBar对象的setValue()方法。
下面举例示范一个简单的进度条例子:
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JProgressBar; public class JProgressBarTest { private JFrame frame = new JFrame("测试进度条"); //创建一个垂直进度条 private JProgressBar bar = new JProgressBar(JProgressBar.VERTICAL); private JCheckBox indeterminate = new JCheckBox("不确定进度"); private JCheckBox noBorder = new JCheckBox("不绘制边框"); public void init() { Box box = new Box(BoxLayout.Y_AXIS); box.add(indeterminate); box.add(noBorder); frame.setLayout(new FlowLayout()); frame.add(box); //把进度条件添加到JFrame窗口中 frame.add(bar); //设置进度条的最大值和最小值 bar.setMinimum(0); bar.setMaximum(100); //设置在进度条中绘制完成百分比 bar.setStringPainted(true); noBorder.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { //根据选择框决定是否绘制 进度条的边框 bar.setBorderPainted(!noBorder.isSelected()); } }); indeterminate.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { //设置该进度条的进度是否确定 bar.setIndeterminate(indeterminate.isSelected()); bar.setStringPainted(!indeterminate.isSelected()); } }); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); //采用循环方式来不断改变进度条的完成进度 for(int i = 0;i <= 100;i++) { //改变进度条的完成进度 bar.setValue(i); try { //程序暂停0.3秒 Thread.sleep(300); } catch(Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { new JProgressBarTest().init(); } }
下面举例,使用一个计时器来不断取得目标程序的完成情况,并根据其完成情况来修改进度条的value属性。
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JProgressBar; import javax.swing.Timer; public class JProgressBarTest2 { private JFrame frame = new JFrame("测试进度条"); //创建一条垂直进度条 private JProgressBar bar = new JProgressBar(JProgressBar.VERTICAL); private JCheckBox indeterminate = new JCheckBox("不确定进度"); private JCheckBox noBorder = new JCheckBox("不绘制边框"); public void init() { Box box = new Box(BoxLayout.Y_AXIS); box.add(indeterminate); box.add(noBorder); frame.setLayout(new FlowLayout()); frame.add(box); //把进度条件添加到JFrame窗口中 frame.add(bar); //设置在进度条中绘制完成百分比 bar.setStringPainted(true); noBorder.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { //根据选择框决定是否绘制 进度条的边框 bar.setBorderPainted(!noBorder.isSelected()); } }); final SimulateActivity target = new SimulateActivity(1000); //以启动一条线程的方式来执行一个耗时的任务 new Thread(target).start(); //设置进度条的最大值和最小值 bar.setMinimum(0); bar.setMaximum(target.getAmount()); Timer timer = new Timer(300,new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { //以任务的当前完成量设置进度条的value属性 bar.setValue(target.getCurrent()); } }); timer.start(); indeterminate.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { //设置该进度条的进度是否确定 bar.setIndeterminate(indeterminate.isSelected()); bar.setStringPainted(!indeterminate.isSelected()); } }); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new JProgressBarTest2().init(); } } //模拟一个耗时的任务 class SimulateActivity implements Runnable { //任务的当前完成量 private volatile int current; //总任务量 private int amount; /** * 功能: * 带参数构造函数 * @param amount */ public SimulateActivity(int amount) { current = 0; this.amount = amount; } public int getCurrent() { return current; } public int getAmount() { return amount; } //run方法代表不断完成任务的过程 @Override public void run() { while(current < amount) { try { Thread.sleep(50); } catch(Exception e) { e.printStackTrace(); } current++; } } }
(二)创建进度条对话框
ProgressMonitor创建进度条对话框。
提供了如下构造函数:
ProgressMonitor(Component parentComponent,Object message,String note,int min,int max):该构造器中的paraentComponent参数用于设置该进度条对话框的父组件,message用于设置进度条对话框的描述信息,note用于设置该进度条对话框的提示文本,min和max用于设置该对话所包含的进度条的最小值和最大值。
下面程序示范了 ProgressMonitor的使用:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ProgressMonitor; import javax.swing.Timer; public class ProgressMonitorTest { private Timer timer; public void init() { final SimulateActivity1 target = new SimulateActivity1(1000); //以启动一条线程的方式来执行一个耗时的任务 final Thread targetThread = new Thread(target); targetThread.start(); final ProgressMonitor dialog = new ProgressMonitor(null,"等待任务完成","已完成",0,target.getAmount()); timer = new Timer(300,new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { //以任务的当前完成量设置进度对话框的完成比例 dialog.setProgress(target.getCurrent()); //如果用户单击了进度对话框中的"取消"按钮 if(dialog.isCanceled()) { //停止计时器 timer.stop(); //中断任务的执行 targetThread.interrupt(); //系统退出 System.exit(0); } } }); timer.start(); } public static void main(String[] args) { new ProgressMonitorTest().init(); } } //模拟一个耗时的任务 class SimulateActivity1 implements Runnable { //任务的当前完成量 private volatile int current; //总任务量 private int amount; /** * 功能: * 带参数构造函数 * @param amount */ public SimulateActivity1(int amount) { current = 0; this.amount = amount; } public int getCurrent() { return current; } public int getAmount() { return amount; } //run方法代表不断完成任务的过程 @Override public void run() { while(current < amount) { try { Thread.sleep(50); } catch(Exception e) { e.printStackTrace(); } current++; } } }