2012-05-24 5 views
5

Mi piacerebbe mostrare la barra di avanzamento nella mia app swing, che comprimerà il file selezionato. per questo processo voglio mostrare una barra di avanzamento durante l'elaborazione. Può essere in un JOptionPane o un pannello dato come parametro per l'utilità.come aggiungere la barra di avanzamento all'utilità zip durante la compressione o l'estrazione in java?

//Select a text file to be zip  
JFileChooser chooser = new JFileChooser(); 
chooser.setCurrentDirectory(new File(".")); 


chooser.setFileFilter(new javax.swing.filechooser.FileFilter() { 
    public boolean accept(File f) { 
    return f.getName().toLowerCase().endsWith(".txt") 
     || f.isDirectory(); 
    } 

    public String getDescription() { 
    return "GIF Images"; 
    } 
}); 

String source =""; 
int r = chooser.showOpenDialog(new JFrame()); 
if (r == JFileChooser.APPROVE_OPTION) { 
    source = chooser.getSelectedFile().getPath(); 
    File file = chooser.getSelectedFile(); 

//Start ZIP 
try { 

     String target = "upload/data-1.zip"; 
     ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(target)); 
     FileInputStream fis = new FileInputStream(file); 

     // put a new ZipEntry in the ZipOutputStream 
     zos.putNextEntry(new ZipEntry(file.getName())); 

     int size = 0; 
     byte[] buffer = new byte[1024]; 
     JProgressBar pb = new JProgressBar(); 
     pb.setStringPainted(true); 
     pb.setIndeterminate(true); 

     JPanel panel = new JPanel(); 
     panel.add(pb); 
     JOptionPane.showInputDialog(panel); 



     // read data to the end of the source file and write it to the zip 
     // output stream. 
     while ((size = fis.read(buffer, 0, buffer.length)) > 0) { 
       zos.write(buffer, 0, size); 
       pb.setValue(size); 
       pb.repaint(); 
       if (size >= file.size) { 
       panel.dispose(); 
       } 
      <<HERE I TRIED TO GIVE PROGRESS ABR VALUE BUT NOT SUCCEDED>> 
     } 

     zos.closeEntry(); 
     fis.close(); 

     // Finish zip process 
     zos.close(); 
     System.out.println("finished"); 
} catch (IOException e) { 
     e.printStackTrace(); 
} 
} 
+0

qual è la domanda? Il codice indicato non funziona? – javagirl

risposta

5

Considerare l'utilizzo di SwingWorker. È possibile aggiornare l'interfaccia utente con risultati intermedi utilizzando il metodo process(). Inoltre, SwingWorker ha associato la proprietà progress. È possibile utilizzare setProgress() per aggiornarlo. Quindi, aggiungere PropertyChangeListener per rispondere agli aggiornamenti di proprietà progress.

Check out How to Use Progress Bars. L'articolo dimostra la collaborazione di SwingWorker con una barra di avanzamento.

2

non è possibile comprimere il file su EventDispatchThread, o il tuo Gui è bloccato durante il processo e non vedrai i progressi nel ProgressBar. Usa uno SwingWorker.