Java文件进度条

时间:2011-06-21 18:48:21

标签: java progress-bar zipfile jprogressbar

我是Java的新手。 我想编写一个使文件成为弧形的程序 我想使用进度条显示压缩的进度 有我的代码,但它不起作用 工作完成时只显示100%。

        getContentPane().add(progressBar);
    progressBar.setBorder(new CompoundBorder(null, null));
    springLayout.putConstraint(SpringLayout.EAST, progressBar, 0, SpringLayout.EAST, messageLabel);
    springLayout.putConstraint(SpringLayout.WEST, progressBar, 0, SpringLayout.WEST, messageLabel);
    springLayout.putConstraint(SpringLayout.SOUTH, progressBar, 165, SpringLayout.NORTH, getContentPane());
    springLayout.putConstraint(SpringLayout.NORTH, progressBar, 5, SpringLayout.SOUTH, uploadLocalButton);
    progressBar.setValue(0);
    progressBar.setMaximum(100);
    progressBar.setMinimum(0);
    progressBar.setStringPainted(true); 
...
 public void doZip(String filename,String outFilename) 
 {
     try {
        byte[] dataBytes = new byte[1024];
        File file = new File(outFilename);
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        ZipOutputStream zos = new ZipOutputStream(fos);
        File fil = new File(filename); //"Users/you/image.jpg"
        long length= fil.length();
        System.out.println(length);
        zos.putNextEntry(new ZipEntry(fil.getName()));//image.jpg
        FileInputStream in = new FileInputStream(filename);
        int current=0;
        int len;

        while ((len = in.read(dataBytes)) > 0) 
        { current += len; 
        messageLabel.setText(Integer.toString(current));
        System.out.println(current);
        final double progres=(((double)current/(double)length)*100);
        progressBar.setValue((int)progres);             
            zos.write(dataBytes, 0, dataBytes.length);
        }

        zos.closeEntry();
        zos.close();
        in.close();
 }catch (IOException e) {
        JOptionPane.showMessageDialog(null,
                "Access denied. File or patch not exist or in currently in use.","Error",
                JOptionPane.ERROR_MESSAGE);
        e.printStackTrace();

    }}

也许有人知道问题出在哪里?


按下按钮,我打电话给 doZip 。 我试过这个

 while ((len = in.read(dataBytes)) > 0) 
        { current += len; 
        zos.write(dataBytes, 0, dataBytes.length);
        final double progres=(((double)current/(double)length)*100);
        try{
            SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                progressBar.setValue((int)progres);
                }
            });
            java.lang.Thread.sleep(100);
        }catch(InterruptedException e){;}

但它也有效,只会使拉链操作的过程更长。

1 个答案:

答案 0 :(得分:2)

我假设您正在从AWT线程中的某个地方调用doZip(例如,由操作处理程序直接调用(in)作为对点击或其他内容的响应)。因此,在操作(压缩)完成之前,UI不会更新,即使您在两者之间相应地设置了进度..

一个解决方案是在一个单独的线程中启动doZip(通常,建议避免AWT线程中的任何代价高昂的操作,但只做基本的“动作处理”并触发长时间运行的操作那里...)