随笔 - 154  文章 - 60  trackbacks - 0
<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

声明:

该blog是为了收集资料,认识朋友,学习、提高技术,所以本blog的内容除非声明,否则一律为转载!!

感谢那些公开自己技术成果的高人们!!!

支持开源,尊重他人的劳动!!

常用链接

留言簿(3)

随笔分类(148)

随笔档案(143)

收藏夹(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); 
  }
 
}
posted on 2007-11-01 13:44 lk 阅读(2452) 评论(0)  编辑  收藏 所属分类: j2se

只有注册用户登录后才能发表评论。


网站导航: