5

我想在我的 Swing 应用程序中显示进度条,它将压缩选定的文件。对于这个过程,我想在处理时显示一个进度条。它可能在 JOptionPane 或给定面板中作为实用程序的参数。

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

2 回答 2

5

考虑使用SwingWorkerprocess()您可以使用方法使用中间结果更新 UI 。此外,SwingWorker具有绑定progress属性。您可以使用setProgress()来更新它。然后,添加PropertyChangeListener以响应progress属性更新。

查看如何使用进度条。文章通过进度条演示了 SwingWorker 的协作。

于 2012-05-24T16:37:34.750 回答
2

您无法在 EventDispatchThread 上压缩文件,或者您的 Gui 在此过程中被阻止并且您不会在 ProgressBar 中看到进度。使用 SwingWorker。

于 2012-05-24T16:41:37.827 回答