Java图形化界面---进度条

目录

一、进度条的介绍

二、创建进度条

三、简单案例

 四、子线程创建进度条

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

        }
    }
}

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜到极致就是渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值