使用Java高速实现进度条
基于有人问到如何做进度条,以下给个简单的做法:
主要是使用JProgressBar(Swing内置javax.swing.JProgressBar)和SwingWorker(Swing内置javax.swing.SwingWorker)
有人肯定会说,不是用线程做的吗?使用线程共享一个变量,确实能够。只是这样的方式不太优雅,当然,你能够再用线程封装也行。只是,SwingWorker已经帮我们封装好啦~~使用现成的东西来做还是方便^_^
先看效果:





以下看代码:非常easy,相信各位大大肯定是懂的~
package org.ubird;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class TestSwingWorker extends SwingWorker<List<Image>,String>{
private JLabel status;
	private JPanel viewer;
	private String[] imagesName;
	private JProgressBar jpb;
public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable(){
			public void run() {
				TestFrame frame = new TestFrame();
				final JPanel panel = new JPanel();
				final JLabel label = new JLabel();
final String[] imagesName = new String[38];
				for(int i=0; i<imagesName.length; i++){
					imagesName[i] = "res/1 ("+(i+1)+").jpg";
				}
JScrollPane sp = new JScrollPane(panel);
				sp.setSize(new Dimension(700,500));
				frame.add(sp,BorderLayout.CENTER);
JPanel stp = new JPanel();
				final JProgressBar jpb = new JProgressBar();
				jpb.setMinimum(1);
				jpb.setMaximum(imagesName.length);
				stp.add(jpb);
				stp.add(label);
				frame.add(stp,BorderLayout.SOUTH);
JButton button = new JButton("load image");
				button.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e) {
						TestSwingWorker sw = new TestSwingWorker(label, panel, imagesName, jpb);
						sw.execute();
					}
				});
frame.add(button,BorderLayout.NORTH);
frame.setVisible(true);
			}
		});
	}
public TestSwingWorker(JLabel status, JPanel viewer, String[] imagesName, JProgressBar jpb){
		this.status = status;
		this.viewer = viewer;
		this.imagesName = imagesName;
		this.jpb = jpb;
	}
@Override
	protected List<Image> doInBackground() throws Exception {
		List<Image> image = new ArrayList<Image>();
		for(int i=0; i<imagesName.length; i++){
			image.add(ImageIO.read(getClass().getClassLoader().getResource(imagesName[i])));
			publish("已经载入了  "+(i+1)+"/"+imagesName.length+" : "+imagesName[i]);
		}
		return image;
	}
@Override
	protected void process(List<String> chunks) {
		status.setText(chunks.get(chunks.size()-1));
		int x = Integer.parseInt(chunks.get(chunks.size()-1).substring(chunks.get(chunks.size()-1).indexOf("(")+1,chunks.get(chunks.size()-1).indexOf(")")).trim());
		jpb.setValue(x);
for(String str : chunks){
			System.out.println(str);
		}
	}
@Override
	protected void done() {
		try {
			for(Image image : get()){
				JLabel label = new JLabel(new ImageIcon(image));
				label.setSize(160, 120);
				label.setPreferredSize(new Dimension(160,120));
				viewer.add(label);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
	}
}
package org.ubird;
import javax.swing.JFrame;
public class TestFrame extends JFrame {
public TestFrame(){
		setTitle("Test Frame");
		setSize(800,600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}
该程序的可执行源代码、资源图片的下载地址:http://download.csdn.net/source/3245370
NOTE:解压后双击里面的:CompileAndRun.bat可在Win下直接执行
使用Java高速实现进度条的更多相关文章
- 使用Java快速实现进度条(转)
		
基于有人问到怎样做进度条,下面给个简单的做法: 主要是使用JProgressBar(Swing内置javax.swing.JProgressBar)和SwingWorker(Swing内置javax. ...
 - Java web实时进度条整个系统共用(如java上传进度条、导入excel进度条等)
		
先上图: 这上文件上传的: 这是数据实时处理的: 1:先说说什么是进度条:进度条即计算机在处理任务时,实时的,以图片形式显示处理任务的速度,完成度,剩余未完成任务量的大小,和可能需要处理时间,显示方式 ...
 - Java web实时进度条整个系统共用(如java上传、下载进度条、导入、导出excel进度条等)
		
先上图: 文件上传的: 2017-05-04再次改进.在上传过程中用户可以按 Esc 来取消上传(取消当前上传,或者是全部上传)... 2019-03-26更新进度条显示体验 从服务器上压缩下载: 从 ...
 - 《2018面向对象程序设计(java)课程学习进度条》
		
学习收获最大的程序阅读或编程任务 课堂/课余学习时间(小时) 发布博客/评论他人博客数量 (阅读/编写)代码行数 周次 九九乘法表 ...
 - 2018面向对象程序设计(Java)学习进度条
		
周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课堂/课余学习时间(小时) 最满意的编程任务 第一周 200/30 1/0 6/3 九九乘法表 第二周 200/30 1/0 4/3 实验2 ...
 - java进行文件上传,带进度条
		
网上看到别人发过的一个java上传的代码,自己写了个完整的,附带源码 项目环境:jkd7.tomcat7. jar包:commons-fileupload-1.2.1.jar.commons-io-1 ...
 - Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
		
本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力. 首先看一下效果图吧, 原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label ...
 - 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条
		
http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...
 - Java实现在复制文件时使用进度条
		
在对大文件操作时,可能会需要些时间,此时为用户提供进度条提示是非常常见的一项功能,这样用户就可以了解操作文件需要的时间信息.本实例为大家介绍了在复制大的文件时使用的进度条提示,需要注意的是,只有在读取 ...
 
随机推荐
- Reading or Writing to Another Processes Memory in C# z
			
http://www.jarloo.com/reading-and-writing-to-memory/ Declarations [Flags] public enum ProcessAccessF ...
 - C++标准库开发心得
			
最近放弃MFC,改用C++标准库开发产品.毕竟MFC用熟了,马上改用STL还不太习惯.下面列出下总结的改用STL遇到的问题和解决办法: 1.清除空格 remove_if(iterBegin, iter ...
 - [转]解决crystal report水晶报表在浏览器提示bobj未定义的错误
			
网上的中文文章(比如这篇文章)都是写的部署到服务器后出现的问题,同时也指出要把crystal report的aspnet_client文件夹拷贝到对应项目的根目录里,这样就可以正常显示了,但是具体到我 ...
 - javascript 面向对象制作坦克大战 (一)
			
PS:这个坦克大战是在网上下的一段源码之后,自己进行的重写. 写这个的目的是为了巩固自己这段时间对js的学习.整理到博客上,算是对自己近端时间学习js的一个整理. 同时也希望可以帮助到学习js的园 ...
 - 数据库连接类oracleHelper
			
//=============================================================================== // OracleHelper ba ...
 - htmlcss笔记--标签默认值样式重置css reset(2)
			
1.内联,内嵌,行内元素: 默认可以继续跟同类型标签显示: 由内容撑开宽度,内容多宽,会有多宽: span,内嵌标签部支持宽高,即使加了宽高也不支持, 也不支持上下内外边距,但是支持左右内外边距:内上 ...
 - 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数
			
// 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数 // 思路: // http://blog.csdn.net/huzecong/article/details/847868 ...
 - WinForm编程时窗体设计器中ComboBox控件大小的设置
			
问题描述: 在VS中的窗体设计器中拖放一个ComboBox控件后想调整控件的大小.发现在控件上用鼠标只能拖动宽度(Width)无法拖动(Height). 解决过程: 1.控件无法拖动,就在属性窗口中设 ...
 - 【Spark学习】Apache Spark监控与测量
			
Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4137952.html
 - Codeforces 375
			
A 7的所有的余数都可以用1,6,8,9排列得到,然后搞一下就可以了. B 可以用类似于单调队列的东西搞.具体看代码: /* * Problem: B. Maximum Submatrix 2 * A ...