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

SwingWorkerの使用を検討してください。process()メソッドを使用して、中間結果で UI を更新できます。また、SwingWorkerバインドされprogressたプロパティがあります。setProgress()を使用して更新できます。次に、プロパティの更新PropertyChangeListenerに応答するように追加します。progress

プログレス バーの使用方法を確認してください。この記事では、SwingWorker とプログレス バーのコラボレーションについて説明します。

于 2012-05-24T16:37:34.750 に答える
2

EventDispatchThread でファイルを圧縮できないか、処理中に Gui がブロックされ、ProgressBar に進行状況が表示されません。SwingWorker を使用します。

于 2012-05-24T16:41:37.827 に答える