进度条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
}
}
}
}
}