使用Java快速实现进度条(转)

基于有人问到怎样做进度条,下面给个简单的做法:

主要是使用JProgressBar(Swing内置javax.swing.JProgressBar)和SwingWorker(Swing内置javax.swing.SwingWorker)

 

有人肯定会说,不是用线程做的吗?使用线程共享一个变量,确实可以。不过这种方式不太优雅,当然,你可以再用线程封装也行。不过,SwingWorker已经帮我们封装好啦~~使用现成的东西来做还是方便^_^

 

先看效果:

 

 

 

 

 

 

 

 

下面看代码:很简单,相信各位大大肯定是懂的~

[java] view plaincopy

  1. package org.ubird;  
  2.   
  3. import java.awt.BorderLayout;  
  4. import java.awt.Dimension;  
  5. import java.awt.Image;  
  6. import java.awt.event.ActionEvent;  
  7. import java.awt.event.ActionListener;  
  8. import java.util.ArrayList;  
  9. import java.util.List;  
  10. import java.util.concurrent.ExecutionException;  
  11.   
  12. import javax.imageio.ImageIO;  
  13. import javax.swing.ImageIcon;  
  14. import javax.swing.JButton;  
  15. import javax.swing.JLabel;  
  16. import javax.swing.JPanel;  
  17. import javax.swing.JProgressBar;  
  18. import javax.swing.JScrollPane;  
  19. import javax.swing.SwingUtilities;  
  20. import javax.swing.SwingWorker;  
  21.   
  22. public class TestSwingWorker extends SwingWorker<List<Image>,String>{  
  23.   
  24.     private JLabel status;  
  25.     private JPanel viewer;  
  26.     private String[] imagesName;  
  27.     private JProgressBar jpb;  
  28.       
  29.     public static void main(String[] args) {  
  30.         SwingUtilities.invokeLater(new Runnable(){  
  31.             public void run() {  
  32.                 TestFrame frame = new TestFrame();  
  33.                 final JPanel panel = new JPanel();  
  34.                 final JLabel label = new JLabel();  
  35.                   
  36.                 final String[] imagesName = new String[38];  
  37.                 for(int i=0; i<imagesName.length; i++){  
  38.                     imagesName[i] = "res/1 ("+(i+1)+").jpg";  
  39.                 }  
  40.                   
  41.                 JScrollPane sp = new JScrollPane(panel);  
  42.                 sp.setSize(new Dimension(700,500));  
  43.                 frame.add(sp,BorderLayout.CENTER);  
  44.                   
  45.                 JPanel stp = new JPanel();  
  46.                 final JProgressBar jpb = new JProgressBar();  
  47.                 jpb.setMinimum(1);  
  48.                 jpb.setMaximum(imagesName.length);  
  49.                 stp.add(jpb);  
  50.                 stp.add(label);  
  51.                 frame.add(stp,BorderLayout.SOUTH);  
  52.                   
  53.                 JButton button = new JButton("load image");  
  54.                 button.addActionListener(new ActionListener(){  
  55.                     public void actionPerformed(ActionEvent e) {  
  56.                         TestSwingWorker sw = new TestSwingWorker(label, panel, imagesName, jpb);  
  57.                         sw.execute();  
  58.                     }  
  59.                 });  
  60.   
  61.                 frame.add(button,BorderLayout.NORTH);  
  62.                   
  63.                 frame.setVisible(true);  
  64.             }  
  65.         });  
  66.     }  
  67.       
  68.     public TestSwingWorker(JLabel status, JPanel viewer, String[] imagesName, JProgressBar jpb){  
  69.         this.status = status;  
  70.         this.viewer = viewer;  
  71.         this.imagesName = imagesName;  
  72.         this.jpb = jpb;  
  73.     }  
  74.   
  75.     @Override  
  76.     protected List<Image> doInBackground() throws Exception {  
  77.         List<Image> image = new ArrayList<Image>();  
  78.         for(int i=0; i<imagesName.length; i++){  
  79.             image.add(ImageIO.read(getClass().getClassLoader().getResource(imagesName[i])));  
  80.             publish("已经加载了  "+(i+1)+"/"+imagesName.length+" : "+imagesName[i]);  
  81.         }  
  82.         return image;  
  83.     }  
  84.   
  85.     @Override  
  86.     protected void process(List<String> chunks) {  
  87.         status.setText(chunks.get(chunks.size()-1));  
  88.         int x = Integer.parseInt(chunks.get(chunks.size()-1).substring(chunks.get(chunks.size()-1).indexOf("(")+1,chunks.get(chunks.size()-1).indexOf(")")).trim());  
  89.         jpb.setValue(x);  
  90.           
  91.         for(String str : chunks){  
  92.             System.out.println(str);  
  93.         }  
  94.     }  
  95.   
  96.     @Override  
  97.     protected void done() {  
  98.         try {  
  99.             for(Image image : get()){  
  100.                 JLabel label = new JLabel(new ImageIcon(image));  
  101.                 label.setSize(160, 120);  
  102.                 label.setPreferredSize(new Dimension(160,120));  
  103.                 viewer.add(label);  
  104.             }  
  105.         } catch (InterruptedException e) {  
  106.             e.printStackTrace();  
  107.         } catch (ExecutionException e) {  
  108.             e.printStackTrace();  
  109.         }  
  110.     }  
  111.       
  112.       
  113. }  

 

 

 

[java] view plaincopy

  1. package org.ubird;  
  2.   
  3. import javax.swing.JFrame;  
  4.   
  5. public class TestFrame extends JFrame {  
  6.   
  7.   
  8.     public TestFrame(){  
  9.         setTitle("Test Frame");  
  10.         setSize(800,600);  
  11.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  12.     }  
  13. }  

 

 

 

该程序的可运行源码、资源图片的下载地址:http://download.csdn.net/source/3245370

NOTE:解压后双击里面的:CompileAndRun.bat可在Win下直接运行

http://blog.csdn.net/kakashi8841/article/details/6388797

 

时间: 2024-08-04 13:17:59

使用Java快速实现进度条(转)的相关文章

软件-java程序设计 下载 进度条显示

问题描述 java程序设计 下载 进度条显示 当我在一个页面点击下载下载软件时,能否将名称和进度条显示在另一个页面 我需要用java实现程序设计,如果可以的话麻烦贴出代码,在百度上看了很多, 没有找到可以使用的,谢谢了 解决方案 天生java做activex也很困难.不如用C++ 解决方案二: 如果是基于浏览器的话,不可以实现.因为服务器端程序不能直接控制浏览器读写文件,也不能获知下载进度. 除非你在客户端部署程序,比如activex控件. 解决方案三: 迅雷就是我说的,在客户端部署程序实现的.

软件-java 线程控制进度条 暂停继续

问题描述 java 线程控制进度条 暂停继续 用java实现从网上下载的进度条,想要添加按钮控制进度条比如说点击暂停,软件暂停下载,点击继续后继续下载,要怎么实现这样的功能 解决方案 1.通过http,制定Range头的文件获取字节范围.2.本机通过获取内容用RandomAccessFile 存储. 解决方案二: 首先你的服务器要支持分块下载.或者说断点续传.这样实现你说的功能就很简单了.暂停无非就是下载完当前正在下载的块或者丢弃当前下载的块.继续就是寻找没有下载的块,然后接着下载.

java+swing界面进度条不能同步,该怎样解决,急急急急急!!!!!

问题描述 java+swing界面进度条不能同步,该怎样解决,急急急急急!!!!! for(int i=0;i<5464646354;i++){ ........... double xx=(double)(i/Diedai.iteration)*100; int x=(int)xx; AboutIOBLPSO.JinDuTiao.setValue(x); //AboutIOBLPSO是一个类,里面有变量 public static javax.swing.JProgressBar JinDuT

java后台+多进度条监控+异步+html5批量上传图片+jquery

问题描述 java后台+多进度条监控+异步+html5批量上传图片+jquery 小弟现在要做一个项目,情况是这样的,基于html5批量选择文件:java后台监控进程:jQuery发回调函数:一个文件配对一个进度条,点击上传后所有文件同时上传,不等待,并同时.分别显示进度百分比:就是异步同时上传,同时监控.现在的问题是java后台的servlet中的方法的变量如何循环如何写.jQuery的回调函数怎么写?请高人指点.(除了jQuery库之外不加任何插件) 解决方案 java 图片批量上传 htm

Java:ajax进度条

在最近的一个项目中,有一个上传功能:上传一个cvs文件,然后解析此文件并写入数据库 由于经常需要传很大的文件,客户完成此功能往往需要40分钟,在这个过程中,页面也没有任何提示,用户体验非常不好? 为何不用ajax作一个进度条呢? 分两步完成此需求: 一:写一个简单的ajax,实现最简单的进度条功能. 二:把此进度条改造为项目可用的进度条. 一:最简单的进度条 1.客户端每2秒发送一个createXMLHttpRequest请求给服务端.并得到服务端返回的进度数据.根据服务端返回的数据,用java

WEB应用程序中的进度条

web|程序 WEB应用程序中的进度条 Julien Cheyssial 写作于2003/10/01 Joise.LI翻译并修改于2004-4-2 写在前面: 原文是我在需要使用进度条时找到的一篇文章,讲解详细并附有实例.我在原文的基础上加上了自己的修改:增加了线程处理并且将进度条的使用放到了子线程中处理.这是我第一次翻译文章,敬请各位指正.原文见于http://www.myblogroll.com/Articles/progressbar/,请对照参考. 谁说在WEB应用程序中不能使用进度条?

swing 进度条

1,进度条实例     2,创建一个进度条 Java代码   copyProgressBar = new JProgressBar();           copyProgressBar.setBorderPainted(true);           copyProgressBar.setString(PROGRESSINITSTR);           copyProgressBar.setStringPainted(true);       3,进度条两种模式 模式一:百分比模式(d

进度条-非阻塞异步处理。敬请高人指点,不胜感激。

问题描述 非阻塞异步处理.敬请高人指点,不胜感激. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>/c:set <!DOCTY

php使用APC实现实时上传进度条功能_php技巧

php不具备实时上传进度条功能,如果想有这种功能我们一般会使用ajax来实现,但是php提供了一个apc,它就可以与php配置实现上传进度条功能. 主要针对的是window上的应用.1.服务器要支持apc扩展,没有此扩展的话,下载一个扩展扩展要求php.5.2以上. 2.配置apc相关配置,重启apache代码如下 extension=php_apc.dll   apc.rfc1867 = on   apc.max_file_size = 1000M   upload_max_filesize