最近需要用到进度条,于是就查看了一下oracle的文档,看了一下java中进度条的显示方法,现在就总结一下。

java提供了三种关于进度条的显示类。

1:JProgressBar(进程条

2:ProgressMonitor(进程监视

3:ProgressMonitorInputStream(进程监视流)

   那么这三种之间有什么区别呢?下面我进行一下简单的介绍,并提供例子方便大家理解。

JprogressBar

作为一个组件,显示 当前完成了多少工作。

ProgressMonitor

这个不能作为一个组件显示,他会弹出一个框,在框里面来显示进度。

ProgressMonitorInputStream

这个从名字就看出来了这个类的作用了,就是将这个输入流通过progressMonitorInputStream包装,然后通过调用getProgressMonitor可以查看进度。

咱们主要用的就是前两个,所有我再次介绍一下前两种方法。其实JprogressBar和ProgressMonitor的原理都是一样的。首先创建一个类继承SwingWorker,这个类的功能主要有三个:

1:他会在doInBackground这个方法里面,执行你所需要干的事情。这个方法会开启一个线程,这样的用户就不会在此阻塞而干不了其他的事情了。

2:当这个任务结束的时候,会调用done方法,你可以在这里面写入自己的实现。例如,弹出一个框显示任务结束。

3:有一个int类型的变量progress,这个变量就是显示任务的执行进度,每次progress改变的时候,propertyChange这个方法就会被调用。

这样思路就更加清晰了,首先创建的类A继承SwingWorker,在doInBackground这个方法里面写上你需要显示进度的任务,并在适当的时候通过调用setProgress(value)方法改变progress这个值,value代表任务进行到多少了,最少是0,最大是100(代表任务结束了),当然用户也可以自己进行设定最小最大值。如果有需要的话,也可以在done方法里面写上自己的实现。

创建另外一个类B,这个类的作用就是通过进度条来显示你的任务进行到哪个地步了。在类A当中提过了,在doInBackground中,用户通过改变progress来表示任务执行的情况,所以只要当类A中的progress一改变我就把值得到,这个值就是当前任务的完成率,然后在类B中显示到进度条上就可以了。所以我们要给类A中的progress添加一个监听器,这个监听器其实就是类B。因此B需要实现PropertyChangeListener这个接口,实现PropertyChange()这个方法.

接下来要做的就是实例化类A,并添加监听器,然后执行类A的任务就可以了。如下例:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.beans.*;
import java.util.Random;
public class ProgressBarDemo extends JPanel
                              implements ActionListener,
                                         PropertyChangeListener {
     private JProgressBar progressBar;
     private JButton startButton;
     private JTextArea taskOutput;
     private Task task;
     class Task extends SwingWorker<Void, Void> {
         /*
          * Main task. Executed in background thread.
          */
         @Override
         public Void doInBackground() {
             Random random = new Random();
             int progress = 0 ;
             //Initialize progress property.
             setProgress( 0 );
             while (progress < 100 ) {
                 //Sleep for up to one second.
                 try {
                     Thread.sleep(random.nextInt( 1000 ));
                 } catch (InterruptedException ignore) {}
                 //Make random progress.
                 progress += random.nextInt( 10 );
                 setProgress(Math.min(progress, 100 ));
             }
             return null ;
         }
         /*
          * Executed in event dispatching thread
          */
         @Override
         public void done() {
             Toolkit.getDefaultToolkit().beep();
             startButton.setEnabled( true );
             setCursor( null ); //turn off the wait cursor
             taskOutput.append( "Done!\n" );
         }
     }
     public ProgressBarDemo() {
         super ( new BorderLayout());
         //Create the demo's UI.
         startButton = new JButton( "Start" );
         startButton.setActionCommand( "start" );
         startButton.addActionListener( this );
         progressBar = new JProgressBar( 0 , 100 );
         progressBar.setValue( 0 );
         progressBar.setStringPainted( true );
         taskOutput = new JTextArea( 5 , 20 );
         taskOutput.setMargin( new Insets( 5 , 5 , 5 , 5 ));
         taskOutput.setEditable( false );
         JPanel panel = new JPanel();
         panel.add(startButton);
         panel.add(progressBar);
         add(panel, BorderLayout.PAGE_START);
         add( new JScrollPane(taskOutput), BorderLayout.CENTER);
         setBorder(BorderFactory.createEmptyBorder( 20 , 20 , 20 , 20 ));
     }
     /**
      * Invoked when the user presses the start button.
      */
     public void actionPerformed(ActionEvent evt) {
         startButton.setEnabled( false );
         setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
         //Instances of javax.swing.SwingWorker are not reusuable, so
         //we create new instances as needed.
         task = new Task();
         task.addPropertyChangeListener( this );
         task.execute();
     }
     /**
      * Invoked when task's progress property changes.
      */
     public void propertyChange(PropertyChangeEvent evt) {
         if ( "progress" == evt.getPropertyName()) {
             int progress = (Integer) evt.getNewValue();
             progressBar.setValue(progress);
             taskOutput.append(String.format(
                     "Completed %d%% of task.\n" , task.getProgress()));
         }
     }
     /**
      * Create the GUI and show it. As with all GUI code, this must run
      * on the event-dispatching thread.
      */
     private static void createAndShowGUI() {
         //Create and set up the window.
         JFrame frame = new JFrame( "ProgressBarDemo" );
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         //Create and set up the content pane.
         JComponent newContentPane = new ProgressBarDemo();
         newContentPane.setOpaque( true ); //content panes must be opaque
         frame.setContentPane(newContentPane);
         //Display the window.
         frame.pack();
         frame.setVisible( true );
     }
     public static void main(String[] args) {
         //Schedule a job for the event-dispatching thread:
         //creating and showing this application's GUI.
         javax.swing.SwingUtilities.invokeLater( new Runnable() {
             public void run() {
                 createAndShowGUI();
             }
         });
     }
}

这个是一个JProgressBar的例子,下面是一个ProgressMonitor的例子,读者可以比较一下。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.beans.*;
import java.util.Random;
public class ProgressMonitorDemo extends JPanel
                                  implements ActionListener,
                                             PropertyChangeListener {
     private ProgressMonitor progressMonitor;
     private JButton startButton;
     private JTextArea taskOutput;
     private Task task;
     class Task extends SwingWorker<Void, Void> {
         @Override
         public Void doInBackground() {
             Random random = new Random();
             int progress = 0 ;
             setProgress( 0 );
             try {
                 Thread.sleep( 1000 );
                 while (progress < 100 && !isCancelled()) {
                     //Sleep for up to one second.
                     Thread.sleep(random.nextInt( 1000 ));
                     //Make random progress.
                     progress += random.nextInt( 10 );
                     setProgress(Math.min(progress, 100 ));
                 }
             } catch (InterruptedException ignore) {}
             return null ;
         }
         @Override
         public void done() {
             Toolkit.getDefaultToolkit().beep();
             startButton.setEnabled( true );
             progressMonitor.setProgress( 0 );
         }
     }
     public ProgressMonitorDemo() {
         super ( new BorderLayout());
         //Create the demo's UI.
         startButton = new JButton( "Start" );
         startButton.setActionCommand( "start" );
         startButton.addActionListener( this );
         taskOutput = new JTextArea( 5 , 20 );
         taskOutput.setMargin( new Insets( 5 , 5 , 5 , 5 ));
         taskOutput.setEditable( false );
         add(startButton, BorderLayout.PAGE_START);
         add( new JScrollPane(taskOutput), BorderLayout.CENTER);
         setBorder(BorderFactory.createEmptyBorder( 20 , 20 , 20 , 20 ));
     }
     /**
      * Invoked when the user presses the start button.
      */
     public void actionPerformed(ActionEvent evt) {
         progressMonitor = new ProgressMonitor(ProgressMonitorDemo. this ,
                                   "Running a Long Task" ,
                                   "" , 0 , 100 );
         progressMonitor.setProgress( 0 );
         task = new Task();
         task.addPropertyChangeListener( this );
         task.execute();
         startButton.setEnabled( false );
     }
     /**
      * Invoked when task's progress property changes.
      */
     public void propertyChange(PropertyChangeEvent evt) {
         if ( "progress" == evt.getPropertyName() ) {
             int progress = (Integer) evt.getNewValue();
             progressMonitor.setProgress(progress);
             String message =
                 String.format( "Completed %d%%.\n" , progress);
             progressMonitor.setNote(message);
             taskOutput.append(message);
             if (progressMonitor.isCanceled() || task.isDone()) {
                 Toolkit.getDefaultToolkit().beep();
                 if (progressMonitor.isCanceled()) {
                     task.cancel( true );
                     taskOutput.append( "Task canceled.\n" );
                 } else {
                     taskOutput.append( "Task completed.\n" );
                 }
                 startButton.setEnabled( true );
             }
         }
     }
     /**
      * Create the GUI and show it.  For thread safety,
      * this method should be invoked from the
      * event-dispatching thread.
      */
     private static void createAndShowGUI() {
         //Create and set up the window.
         JFrame frame = new JFrame( "ProgressMonitorDemo" );
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         //Create and set up the content pane.
         JComponent newContentPane = new ProgressMonitorDemo();
         newContentPane.setOpaque( true ); //content panes must be opaque
         frame.setContentPane(newContentPane);
         //Display the window.
         frame.pack();
         frame.setVisible( true );
     }
     public static void main(String[] args) {
         //Schedule a job for the event-dispatching thread:
         //creating and showing this application's GUI.
         javax.swing.SwingUtilities.invokeLater( new Runnable() {
             public void run() {
                 createAndShowGUI();
             }
         });
     }
}

下面讲一讲我们什么时候用JProgressBar,什么时候用ProgressMonitor呢?

用到JProgressBar的时候

1:当你需要对进度条进行更加细致的控制的时候,比如给进度条添加事件等等。

2:你需要显示跟进度条有一定关联关系的组件的时候。

3:你需要同时显示多个进度条。

4:这个进度条可以重复使用的时候。

用ProgressMonitor的时候

1:只是想在一个弹出框里面简单的显示进度而已。

2:这个任务不是很重要,用户对此也不是很感兴趣。基于此,ProgressMonitor还提供给了用户cancel的按钮。

3:需要不定时得向用户传递信息(关于任务的信息,例如下一步需要干嘛)。

java中的进度条的显示相关推荐

  1. 解决JupyterLab中tqdm_notebook进度条不显示问题

    文章目录 问题描述 解决方案 问题描述 tqdm针对jupyter notebook添加了专门的进度条方法tqdm_notebook()方法,调用语句如下: from tqdm import tqdm ...

  2. Java 中JProgressBar_Java进度条JProgressBar使用方法

    Java进度条JProgressBar使用方法 package swimg; import java.awt.BorderLayout; import java.awt.Color; import j ...

  3. Android中下载进度条格式,Android开发如何实现文件下载进度条

    释放双眼,带上耳机,听听看~! 今天和小编狗在这里学习下载进度的实现吧,这段代码是网上找的,自己做了些小改,通过模拟器测试.文件下载进度条控制(就是为了高清壁纸加个进度条),自己研究了好久,但是进度条 ...

  4. android加载百分比功能,android进度条怎么显示百分比

    android布局文件里的ProgressBar长形进度条怎么自 在windows操作系统下Android studio按照如下步骤自动义ProgressBar长形进度条的样式. 首先创建一个andr ...

  5. Xamarin XAML语言教程Xamarin.Forms中构建进度条

    Xamarin XAML语言教程Xamarin.Forms中构建进度条 ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度条总是水平放置的.本节将讲解如何使用进度条. 注意:进度条在 ...

  6. matlab 进度条/waitbar 显示运行进度

    当运行大程序,需要跑大量数据的时候,使用进度条可以看到程序究竟运行到什么地方了,哈哈,要不干等着难受(╯﹏╰)-- waitbar的作用是打开或者更新进度条. 1 语法结构 (1.1) h = wai ...

  7. linux mv 递归拷贝,奇技淫巧 - 给Linux中的cp和mv命令中添加进度条的高级拷贝

    GNU cp和GNU mv命令用于在GNU/Linux操作系统中复制和移动文件和目录.这两个命令缺少的一个特性是它们不显示任何进度条.如果复制一个大文件或目录,您就不知道完成复制过程需要多长时间,也不 ...

  8. 创建自绘进度条,并在进度条上显示当前进度的百分比

    平台:VS2005: 资料参考:来源于网络: 内容介绍:创建自绘进度条,并在进度条上显示当前进度的百分比. 第一步:创建基于对话框的工程,在对话框中放置一个进度条控件, 把进度条控件的属性Smooth ...

  9. html打印进度条不显示,LODOP打印URL显示和隐藏进度条

    不建议使用ADD_PRINT_URL: 由于Lodop借用IE下载引擎,与非IE浏览器之间目前不能传递Session(Cookies),所以需要安全验证的页面不要用URL方式打印,要用页面已经下载好的 ...

最新文章

  1. 敏捷开发-Scrum与精益相得益彰
  2. Fedora 30系统下,用g++编译opencv项目
  3. SAP系统和微信集成的系列教程之十:如何在SAP C4C系统里直接回复消息给微信用户
  4. Directed Roads CodeForces - 711D (基环外向树 )
  5. 【POJ - 3169】 Layout(差分约束+spfa)(当板子记?)
  6. 53 年 IT 老兵详谈传统网络到互联网的演变史
  7. 如何在 Flink 1.9 中使用 Hive?
  8. 【Vegas原创】xp_sendmail提示“邮件已发送”但收不到邮件的解决方法
  9. Delphi 2009 安装序列号
  10. 永磁同步电机最大转矩电流比(PMSM-MTPA)Simulink仿真教程
  11. haosou属于搜索引擎的_搜索引擎登录工具
  12. 视觉点胶机系统相机、镜头参数与选择
  13. iOS实现炫酷悬停交互视图
  14. wordpress、shpify、Html破解主题列表
  15. xmind 拖拽_Xmind教程:思维导图原来这么简单实用!
  16. python数据类型的转化和获取
  17. 进行拨测的主要目的都有哪些?
  18. word提示 由于宏安全设置,无法找到宏或宏被禁用 隐藏的模块中的编译错误Declaration32 解决方法
  19. 故障树手册(Fault Tree handbook)(4)
  20. 消息称苹果最快将于2022年推出折叠屏iPhone

热门文章

  1. golang 封装leveldb
  2. 爬虫大战之智联data
  3. 2012-2013年度总结——思想篇
  4. 图像处理之离散傅里叶变换(DFT)
  5. 阿里巴巴一共25000名员工,需要多少人进行绩效管理?(转)
  6. Visual Studio 2010 的 MFC:警告:IntelliSense:无法打开源文件“defines.h”
  7. C# Linq源码解析之Aggregate
  8. Spring xml配置文件头解析
  9. 云会议发展势如破竹 谁会成为最大赢家
  10. php车辆静电贴,怎样清除车窗玻璃上的贴纸 及汽车前挡标志静电贴使用方法