多线程之进度条JProgressBar

来源:互联网 发布:淘宝app充值为什么便宜 编辑:程序博客网 时间:2024/06/04 19:34

进度条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 stubnew 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 exceptione.printStackTrace();}finally{try {if(in!=null)in.close();if(out!=null)out.close();} catch (Exception e2) {// TODO: handle exception}}}}}


0 0
原创粉丝点击