首页 > 代码库 > 第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++;
        }
    }
}