2012-05-24 22 views
5

スイングアプリにプログレスバーを表示して、選択したファイルを圧縮します。 このプロセスでは、処理中に進行状況バーを表示したいと考えています。これは、JOptionPaneまたは指定されたパネルにユーティリティのパラメータとして含めることができます。Javaで圧縮または解凍しながらzipユーティリティにプログレスバーを追加する方法は?

//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

どのような質問ですか?与えられたコードは動作しませんか? – javagirl

答えて

5

SwingWorkerを使用することを検討してください。 process()メソッドを使用して、中間結果でUIを更新できます。また、SwingWorkerは、progressという特性を持っています。 setProgress()を使用して更新することができます。次に、PropertyChangeListenerを追加して、progressプロパティの更新に対応します。

チェックアウトHow to Use Progress Bars。この記事では、SwingWorkerと進行状況バーの連携を示します。

2

EventDispatchThreadでファイルを解凍することはできません。処理中にGuiがブロックされていると、ProgressBarで進捗状況が表示されません。 SwingWorkerを使用します。

関連する問題