2011-06-21 70 views
2

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

 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){;} 

但它也doesent工作,不仅使拉链opperation的过程更加长。

+0

尝试将您的调用包装为线程中的'doZip' – dcn

回答

2

我假设你从AWT线程的某个地方调用doZip(例如,直接由动作处理程序(作为对点击响应的响应)调用)。因此,直到动作(压缩)完成后UI才会更新,即使您在两者之间设置相应的进度。

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