在Java中使用进度条

在读取大型文件或者其它大批量数据输入操作时,希望能够通过一个进度条显示当前的进度,现在在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中继承的方法外,还增加了如下方法:
  1.  ProgressMonitor getProgressMonitor() 
  2.    //得到当前对象使用的ProgressMonitor对象。
  3.  int read() 
  4.  int read(byte[] b) 
  5.  int read(byte[] b, int off, int len) 
  6.  void reset() 
  7.  long skip(long n) 
  8.    //上面几个方法都是覆盖了FilterInputStream中的方法,因为需要更新进度指示。
  9.  void close() 
  10.    //因为需要关闭进度监视对象和窗口,所以覆盖了FilterInputStream父类中的close方法。
 

示例代码


  1. import java.awt.FlowLayout;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.io.FileInputStream;
  5. import java.io.InputStream;
  6. import javax.swing.JButton;
  7. import javax.swing.JFrame;
  8. import javax.swing.ProgressMonitorInputStream;
  9. public class ProgressMonitorTest {
  10.   public static void main(String[] args) {
  11.     // 创建一个包含“Click me”的窗口
  12.     final JFrame f = new JFrame("ProgressMonitor Sample");
  13.     f.getContentPane().setLayout(new FlowLayout());
  14.     JButton b = new JButton("Click me");
  15.     f.getContentPane().add(b);
  16.     f.pack();
  17.     // 设置按钮的动作事件
  18.     b.addActionListener(new ActionListener() {
  19.       public void actionPerformed(ActionEvent e) {
  20.         // 这儿使用了新的线程处理按钮的动作事件,因为我们需要
  21.         //主窗口的线程响应用户。这样你可以多次点击该按钮,
  22.         //会启动多个读取文件的线程。主窗口也保持响应。
  23.         new Thread() {
  24.           public void run() {
  25.             try {
  26.               // 打开文件输出流,把InputStream包装在ProgressMonitorInputStream中。
  27.               //在当前目录中需要放置一个大文件,建议超过50M
  28.               InputStream in = new FileInputStream("bigfile.dat"); 
  29.               ProgressMonitorInputStream pm = 
  30.                   new ProgressMonitorInputStream(f,"Reading a big file",in);
  31.               // 读取文件,如果总耗时超过2秒,将会自动弹出一个进度监视窗口。
  32.               //   显示已读取的百分比。
  33.               int c;
  34.               while((c=pm.read()) != -1) {
  35.                 // 处理代码
  36.               }
  37.               pm.close(); 
  38.             }
  39.             catch(Exception ex) {
  40.               ex.printStackTrace();
  41.             }
  42.           }
  43.         }.start();
  44.       }});  
  45.   
  46.     // 设置缺省的窗口关闭行为,并显示窗口。
  47.     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  48.     f.setVisible(true);
  49.   }
  50. }
posted on 2005-07-29 11:54  轻松逍遥子  阅读(2504)  评论(0编辑  收藏  举报