2015-11-18 3 views
0

У меня есть следующий фрагмент кода, в котором есть индикатор выполнения, который должен прогрессировать.увеличение процентной доли progress

public void createFiles(String srcText, String destText, JTextArea outputTextArea, JProgressBar progressBar) { 
     String zipFilePath = srcText; 
     String destDirectory = destText; 
     UnZip unzipper = new UnZip(); 
     File dir = new File(zipFilePath); 
     File[] files = dir.listFiles(); 
     System.out.println(files.length); 
     double pBarInt = (double) files.length/100; 
     int count = 1; 
     System.out.println(count); 
     if (null != files) { 
      for (int fileIntList = 0; fileIntList < files.length; fileIntList++) { 
       System.out.println("coun in vlocj " + count); 
       String ss = files[fileIntList].toString(); 
       if (null != ss && ss.length() > 0) { 
        try { 
         if (files[fileIntList].isDirectory()) 
          continue; 
         unzipper.unzip(zipFilePath + ss.substring(ss.lastIndexOf("\\") + 1, ss.length()), destDirectory, 
           outputTextArea); 
         if ((fileIntList + 1) % pBarInt == 0) { 
          progressBar.setValue(count); 
          progressBar.update(progressBar.getGraphics()); 
          count += 1; 
         } 

        } catch (Exception ex) { 
         ex.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 

Здесь значение files.length 25.

Мой вопрос, так как есть 25 файлов 1% из них будет 2,5%, может я увеличить свой прогресс бар на каждые 4 обрабатываемых файлов в 10 % или я могу показать 2.5% всякий раз, когда файл был обработан.

Если files.length больше 100, я в состоянии сделать это, но не в состоянии понять, для файлов меньше, чем 100.

пожалуйста, дайте мне знать, как я могу получить это сделать.

Спасибо

+0

Ваш код не работает? –

+0

Привет @tinysunlight, это сработало, но индикатор выполнения остановился на 24%, и было создано 24 файла. – user3872094

+0

. Вы должны получать доступ только к компонентам Swing в Thread Dispatch Thread. Пожалуйста, приложите к этому: https://docs.oracle.com/javase/tutorial/uiswing/examples/components/ProgressBarDemoProject/src/components/ProgressBarDemo.java – keuleJ

ответ

1

Возможно, вам просто нужно установить максимум правильно. Например:

progressBar.setMaximum(files.length); 

Чтобы получить только файлы, а не каталоги в первую очередь сделать:

File[] files = dir.listFiles(new FilenameFilter() { 
    @Override 
    public boolean accept(File file, String name) { 
     return !file.isDirectory(); 
    } 
}); 

Я бы написать целую немного как это:

File[] files = dir.listFiles(new FilenameFilter() { 
    @Override 
    public boolean accept(File file, String name) { 
     return !file.isDirectory(); 
    } 
}); 
progressBar.setMaximum(files.length); 
for (int i = 0; i < files.length; i++) { 
    File f = files[i]; 
    try { 
     unzipper.unzip(f.getAbsolutePath(), destDirectory, outputTextArea); 
     progressBar.setValue(i); 
     progressBar.update(progressBar.getGraphics()); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

И вы могли бы хотите отправить его в поток. См. Комментарий к вашему вопросу.

+0

Это останавливается на 16% :( – user3872094

+0

Я думаю, это потому, что у вас много каталогов, поэтому files.length на самом деле намного больше 25. Вы должны сначала просмотреть список файлов и подсчитать число, которое не является каталогом. Вы также можете сначала отфильтровать список, а затем перебрать отфильтрованный. – morja

+0

Привет, друг, мне это помогает. Спасибо за это. Также этот пост http://stackoverflow.com/questions/4218422/get-the-number-of-files-in-a-folder-omitting- вложенные папки помогли мне. Спасибо снова :) – user3872094

0

Не знаю, почему вам нужно это условие (fileIntList + 1) % pBarInt == 0

Вы должны быть установки счета прогресса бар в процентах от общего количества файлов. Попробуйте использовать

progress.setValue(100); 
.... 
int progressBarValue = count * 100/files.length; 
progressBar.setValue(progressBarValue); 

Для обеспечения точности используйте правильные файлы.length - игнорируя каталоги.

+0

Это идет только до 4% :(Вот мой код добавил 'progressBar.setValue (100); System.out.println (count); if (null! = files) { \t \t \t fo r (int fileIntList = 0; fileIntList 0) {try {if (files [fileIntList] .isDirectory()) continue; unzipper.unzip (zipFilePath + ss.substring (ss.lastIndexOf ("\\") + 1, ss.length()), destDirectory, outputTextArea); int progressBarValue = count * 100/files.length; progressBar.setValue (progressBarValue); ' – user3872094