多线程之进度条JProgressBar

进度条JProgressBar是一个图形组件,用来以图像的方式显示有界面的区间内的一个值,进度条的一个典型应用是显示冗长操作完成的百分比。随着操作的进行,它显示一个从左到右填充的水平矩形或下到上填充的垂直矩形,向用户反映操作执行的进度。JProgressBar通常是通过使用一个线程监视其他线程的完成状态来实现的。进度条可以水平也可以垂直显示。

当一个线程从源文件向目标文件复制数据时,进度条在另一个线程中同时更新。需要创建一个复制文件的线程和一个更新进度条的线程。只需要复制文件中的一些字节,进度条的当前值就被更新,从而显示复制过程的进度。

举个例子,编写一个复制张贴的程序来体现JProgressBar的一些主要特性,完整代码如下:

public class copyFile extends JFrame{
	private JProgressBar jpb=new JProgressBar();
	private JButton jbtCopy=new JButton("Copy");
	private JTextField jtfFrom=new JTextField();
	private JTextField jtfTo=new JTextField();
	
	public copyFile() {
		JPanel jPanel2=new JPanel();
		jPanel2.setLayout(new BorderLayout());
		jPanel2.setBorder(new TitledBorder("From"));
		jPanel2.add(jtfFrom,BorderLayout.CENTER);
		
		JPanel jPanel3=new JPanel();
		jPanel3.setLayout(new BorderLayout());
		jPanel3.setBorder(new TitledBorder("To"));
		jPanel3.add(jtfTo,BorderLayout.CENTER);
		
		JPanel jPanel1=new JPanel();
		jPanel1.setLayout(new GridLayout(2, 1));
		jPanel1.add(jPanel2);
		jPanel1.add(jPanel3);
		
		JPanel jPanel4=new JPanel();
		jPanel4.add(jbtCopy);
		
		this.add(jpb,BorderLayout.NORTH);
		this.add(jPanel1,BorderLayout.CENTER);
		this.add(jPanel4,BorderLayout.SOUTH);
		
		jpb.setStringPainted(true);
		jbtCopy.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				new Thread(new copyFileTask()).start();
			}
		});
	}
	public static void main(String[] args) {
		copyFile frame=new copyFile();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setTitle("CopyFile");
		frame.setSize(400, 180);
		frame.setVisible(true);
	}
	
	class copyFileTask implements Runnable{
		private int currentValue;

		public void run() {
			BufferedInputStream in=null;
			BufferedOutputStream out=null;
			try {
				File inFile=new File(jtfFrom.getText().trim());
				in=new BufferedInputStream(new FileInputStream(inFile));
				
				File outFile=new File(jtfTo.getText());
				out=new BufferedOutputStream(new FileOutputStream(outFile));
				
				long totalBytes=in.available();
				
				jpb.setValue(0);
				jpb.setMaximum(100);
				
				int r;
				long bytesRead=0;
				byte[] b=new byte[100];
				while((r=in.read(b,0,b.length))!=-1){
					out.write(b,0,r);
					bytesRead+=r;
					currentValue=(int)(bytesRead*100/totalBytes);
					
					jpb.setValue(currentValue);
				}
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}finally{
				try {
					if(in!=null)in.close();
					if(out!=null)out.close();
				} catch (Exception e2) {
					// TODO: handle exception
				}
			}
		}
		
		
	}
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值