java 进度条

来源:互联网 发布:恶魔的奶爸扒皮知乎 编辑:程序博客网 时间:2024/05/18 03:46

1.普通进度条

JProcessBar



JLabel label=new JLabel();JProgress progress=new JProgressBar(0,3);label.add(progress, BorderLayout.NORTH);Changer changer =new Changer(progress);//注册ActionListener..........//修改进度条状态的监听类class Changer implements ActionListener{private JProgressBar progress;public Changer(JProgressBar p) { progress= p; }publicvoid actionPerformed(ActionEvent a) { }}

http://www.java2s.com/CN/Code/Java/Swing-JFC/ProgressBar.htm

详细参考



2.文件读取进度条

在读取大型文件或者其它大批量数据输入操作时,希望能够通过一个进度条显示当前的进度,现在在Java中非常容易实现,仅仅需要几行代码即可。Java的swing包提供了ProgressMonitorInputStream类,该类提供了自动地弹出进度窗口和事件处理机制。使用这个类也非常方便,只需要把任何一个InputStream作为参数,构造一个新的ProgressMonitorInputStream类,其它不需要任何额外的代码,即可实现进度窗口的自动生成。ProgressMonitorInputStream类可以和其它InputStream一样使用。 

ProgressMonitorInputStream类继承层次 

[pre]java.lang.Object 
    | 
    +--java.io.InputStream 
                | 
                +--java.io.FilterInputStream 
                            | 
                            +--javax.swing.ProgressMonitorInputStream[/pre] 

构造方法 

ProgressMonitorInputStream(Component   parentComponent,   Object   message,   InputStream   in)   
parentComponent   -   触发被监视操作的组件 
message   -   (如果弹出进度显示窗口),显示在进度显示窗口中的指示信息 
in   -   需要监视的输入流 

操作方法 

除了在InputStream和FilterInputStream中继承的方法外,还增加了如下方法: 

  ProgressMonitor   getProgressMonitor()   
      //得到当前对象使用的ProgressMonitor对象。 
  int   read()   
  int   read(byte[]   b)   
  int   read(byte[]   b,   int   off,   int   len)   
  void   reset()   
  long   skip(long   n)   
      //上面几个方法都是覆盖了FilterInputStream中的方法,因为需要更新进度指示。 
  void   close()   
      //因为需要关闭进度监视对象和窗口,所以覆盖了FilterInputStream父类中的close方法。 
  

示例代码 

import   java.awt.FlowLayout; 
import   java.awt.event.ActionEvent; 
import   java.awt.event.ActionListener; 
import   java.io.FileInputStream; 
import   java.io.InputStream; 

import   javax.swing.JButton; 
import   javax.swing.JFrame; 
import   javax.swing.ProgressMonitorInputStream; 

public   class   ProgressMonitorTest   { 
    public   static   void   main(String[]   args)   { 
        //   创建一个包含“Click   me”的窗口 
        final   JFrame   f   =   new   JFrame( "ProgressMonitor   Sample "); 
        f.getContentPane().setLayout(new   FlowLayout()); 
        JButton   b   =   new   JButton( "Click   me "); 
        f.getContentPane().add(b); 
        f.pack(); 

        //   设置按钮的动作事件 
        b.addActionListener(new   ActionListener()   { 
            public   void   actionPerformed(ActionEvent   e)   { 
                //   这儿使用了新的线程处理按钮的动作事件,因为我们需要 
                //主窗口的线程响应用户。这样你可以多次点击该按钮, 
                //会启动多个读取文件的线程。主窗口也保持响应。 
                new   Thread()   { 
                    public   void   run()   { 
                        try   { 
                            //   打开文件输出流,把InputStream包装在ProgressMonitorInputStream中。 
                            //在当前目录中需要放置一个大文件,建议超过50M 
                            InputStream   in   =   new   FileInputStream( "bigfile.dat ");   
                            ProgressMonitorInputStream   pm   =   
                                    new   ProgressMonitorInputStream(f, "Reading   a   big   file ",in); 
                            //   读取文件,如果总耗时超过2秒,将会自动弹出一个进度监视窗口。 
                            //       显示已读取的百分比。 
                            int   c; 
                            while((c=pm.read())   !=   -1)   { 
                                //   处理代码 
                            } 
                            pm.close();   
                        } 
                        catch(Exception   ex)   { 
                            ex.printStackTrace(); 
                        } 
                    } 
                }.start(); 
            }});     
    
        //   设置缺省的窗口关闭行为,并显示窗口。 
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        f.setVisible(true); 
    }