zoukankan      html  css  js  c++  java
  • Java建立JProgressBar

    转载自:http://www.cnblogs.com/youxin/archive/2012/04/20/2459557.html

    设置JProgressbar主要有以下几个点:

    jpb.setMaximum(100);//设置最大值

    jpb.setMinimum(0);//设置最小值

    jpb.setValue(0);//设置初始值

    jpb.setStringPainted(true);//设置进度条上是否显示进度具体进度如50%

     jpb.setPreferredSize(new Dimension(400,50));设置大小,注意不是setsize

    还有就是他有一个ChangeListener事件,可以监听进度条的变化。

    复制代码
    这是我再百度上看到的那个人得问题,和我的差不多。
    //如下程序,在运行的时候,本应该进度从0显示到9(每0.1秒进度加1)。
    //可是为什么结果是:按下“start”后,没反应,经过短暂的时候,直接
    //显示9?谁能告诉我其中的原因。
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class NewClass
    {
        static JProgressBar jpb=null;
        static JButton jb=null;
        public static void main(String args[])
        {
            JFrame frm=new JFrame();
            Container contentPane=frm.getContentPane();
            jpb=new JProgressBar();
            jpb.setOrientation(JProgressBar.HORIZONTAL);
            jpb.setMaximum(100);jpb.setMinimum(0);jpb.setValue(0);
            jpb.setStringPainted(true);
            jpb.setPreferredSize(new Dimension(400,50));
            contentPane.add(jpb,BorderLayout.CENTER);
            jb=new JButton("Start");
            jb.addActionListener(new Change());
            contentPane.add(jb,BorderLayout.SOUTH);
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.pack();
            frm.setVisible(true);
        }
        static class Change implements ActionListener 
        {
            public void actionPerformed(ActionEvent e)
            {
                for(int i=1;i<10;i++)
                {
                     try
                     {
                         Thread.sleep(100);
                         jpb.setValue(i);
                     }catch(InterruptedException ie){}
                }
            }
        }
    }
    复制代码

    解决办法:

      因为你的程序是单线程的。当你按下按钮的时候,程序就开始执行那个for循环,直到for循环结束为止,程序的控制权才会返回,这段时间内,程序的控制权都在for循环那里,而那里不会做任何事情,只是在不断的设置一个值,然后睡觉。你注意,这时候界面是死的,进度条根本得不到重新绘制的机会(界面重绘,按钮的响应,都是由同一个线程分发的事件,你现在按钮响应事件中写setValue会在事件队列中添加一个事件,但是你自己还没完成,后续的当然更不可能做了),甚至你可以发现你按下按钮后,按钮保持深色,这表明按钮根本没有弹起来。在做这种时间非常长的事件处理的时候,你要新开一个线程才可以。这样,actionPerformed只是新建了一个线程,他会迅速返回,那么后续的repaint事件也可以及时得到执行,GUI就不会死了~

    正确代码:

    复制代码
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class ProgressBar
    {
        static JProgressBar jpb=null;
        static JButton jb=null;
        public static void main(String args[])
        {
            JFrame frm=new JFrame();
            Container contentPane=frm.getContentPane();
            jpb=new JProgressBar();
            jpb.setOrientation(JProgressBar.HORIZONTAL);
            jpb.setMaximum(1000);jpb.setMinimum(0);jpb.setValue(0);
            jpb.setStringPainted(true);
            jpb.setPreferredSize(new Dimension(400,10));
            jpb.setBackground(Color.black);
            jpb.setForeground(Color.red);
            contentPane.add(jpb,BorderLayout.CENTER);
            jb=new JButton("Start");
            jb.addActionListener(new Change());
            contentPane.add(jb,BorderLayout.SOUTH);
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.pack();
            frm.setVisible(true);
        }
        static class Change implements ActionListener {
              public void actionPerformed(ActionEvent e) {
               new Thread(new Runnable() {
                public void run() {
                 for (int i = 900; i >=1; i--) {
                  try {
                   Thread.sleep(100);
                   jpb.setValue(i);
                 
                  } catch (InterruptedException ie) {
                  }
                 }
                }
               }).start();
              }
             }
    }
    复制代码

     



  • 相关阅读:
    Cgroup内核文档翻译(2)——Documentation/cgroup-v1/blkio-controller.txt
    Cgroup内核文档翻译(1)——Documentation/cgroup-v1/00-INDEX
    系统suspend流程介绍
    man 1 ps 翻译
    进程学习杂项汇总
    进程调度杂项汇总
    多线程分享
    redis内部分享ppt
    MassTransit&Sagas分布式服务开发ppt分享
    .net core内部分享ppt
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212268.html
Copyright © 2011-2022 走看看