cum să adăugați bara de progres la zip utilitate în timp ce zipping sau extragerea în java?

Aș dori să afișez bara de progres în aplicația mea swing, care va zip fișierul selectat. pentru acest proces vreau să arăt o bara de progres în timpul procesării.Este posibil să fie într-un JOptionPane sau un panou dat ca parametru pentru utilitate.

//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();
               }
            <>
        }

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

       //Finish zip process
        zos.close();
        System.out.println("finished");
} catch (IOException e) {
        e.printStackTrace();
}
}
0
care este intrebarea? Codul dat nu funcționează?
adăugat autor javagirl, sursa

2 răspunsuri

Luați în considerare utilizarea SwingWorker . Puteți actualiza interfața cu rezultate intermediare utilizând metoda process() . De asemenea, SwingWorker a legat proprietatea progress . Puteți utiliza setProgress() pentru ao actualiza. Apoi, adăugați PropertyChangeListener pentru a răspunde actualizărilor de proprietăți progress .

Consultați Cum să utilizați barele de progres . Articolul demonstrează colaborarea SwingWorker cu o bara de progres.

0
adăugat

nu puteți zip fișierul pe EventDispatchThread sau GUI-ul dvs. este blocat în timpul procesului și nu veți vedea progrese în ProgressBar. Utilizați un SwingWorker.

0
adăugat