2012-05-24 36 views
5

Tôi muốn hiển thị thanh tiến trình trong ứng dụng xoay của tôi, ứng dụng này sẽ nén tệp đã chọn. cho quá trình này tôi muốn hiển thị một thanh tiến trình trong khi xử lý. Nó có thể nằm trong một JOptionPane hoặc một bảng cho trước như một tham số cho tiện ích.cách thêm thanh tiến trình vào tiện ích nén trong khi nén hoặc trích xuất trong java?

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

câu hỏi là gì? Mã đã cho không hoạt động? – javagirl

Trả lời

5

Cân nhắc sử dụng SwingWorker. Bạn có thể cập nhật giao diện người dùng bằng kết quả trung gian bằng phương pháp process(). Ngoài ra, SwingWorker đã ràng buộc tài sản progress. Bạn có thể sử dụng setProgress() để cập nhật. Sau đó, thêm PropertyChangeListener để trả lời progress cập nhật thuộc tính.

Khám phá How to Use Progress Bars. Bài viết thể hiện sự hợp tác của SwingWorker với một thanh tiến trình.

2

bạn không thể nén tệp trên EventDispatchThread hoặc Gui của bạn bị chặn trong quá trình và bạn sẽ không thấy tiến trình trong ProgressBar. Sử dụng SwingWorker.