comment ajouter une barre de progression à l'utilitaire zip lors de la compression ou de l'extraction dans Java?

Je voudrais montrer la barre de progression dans mon application swing, qui va compresser le fichier sélectionné. pour ce processus je veux montrer une barre de progression pendant le traitement. Il peut être dans un JOptionPane ou un panneau donné en tant que paramètre de l'utilitaire.

//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
quelle est la question? Le code donné ne fonctionne pas?
ajouté l'auteur javagirl, source

2 Réponses

Envisagez d'utiliser SwingWorker . Vous pouvez mettre à jour l'interface utilisateur avec des résultats intermédiaires en utilisant la méthode process() . En outre, SwingWorker a lié la propriété progress . Vous pouvez utiliser setProgress() pour le mettre à jour. Ensuite, ajoutez PropertyChangeListener pour répondre aux mises à jour des propriétés progress .

Consultez Comment utiliser les barres de progression . L'article démontre la collaboration de SwingWorker avec une barre de progression.

0
ajouté

vous ne pouvez pas compresser le fichier sur le EventDispatchThread, ou votre Gui est bloqué pendant le processus et vous ne verrez pas de progrès dans le ProgressBar. Utilisez un SwingWorker.

0
ajouté