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