多线程之进度条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
				}
			}
		}
		
		
	}
}


你可能感兴趣的:(多线程之进度条JProgressBar)