Индикатор выполнения зависает при загрузке файла в java

Возможный дубликат:
JProgressBar не будет обновляться

Итак, я пытаюсь показать ход загрузки файла, загружаемого на Java. Я могу вывести текущий процент в виде строки на консоль, но когда я пытаюсь обновить пользовательский интерфейс, он зависает до завершения загрузки.

    public void downloadFile(String fileName) {
    try {
       long startTime = System.currentTimeMillis();

       System.out.println("Connecting to site...\n");

       URL url = new URL("http://assets.minecraft.net/"+fileName+"/minecraft.jar");
       URLConnection connection = url.openConnection();
        try (InputStream reader = url.openStream(); FileOutputStream writer = new FileOutputStream("minecraft.jar")) {
            byte[] buffer = new byte[153600];
            int totalBytesRead = 0;
            int bytesRead = 0;
            int totalSize = connection.getContentLength();
            jProgressBar1.setMaximum(totalSize);

            System.out.println("Downloading\n");

            while ((bytesRead = reader.read(buffer)) > 0) {  
               writer.write(buffer, 0, bytesRead);
               buffer = new byte[153600];
               totalBytesRead += bytesRead;
               jProgressBar1.setValue(totalBytesRead);
               System.out.println(totalBytesRead*100/totalSize+"% complete");
            }

            long endTime = System.currentTimeMillis();

            System.out.println("Done. " + (new Integer(totalBytesRead).toString()) + " bytes read (" + (new Long(endTime - startTime).toString()) + " millseconds).\n");
        }
    }
    catch (MalformedURLException e) {
    }
    catch (IOException e) {
    }
}

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


person AKrush95    schedule 13.01.2013    source источник


Ответы (1)


Одним из вариантов может быть использование SwingWorker. Вот несколько полезных ответов, которые вы можете рассмотреть:

person Eng.Fouad    schedule 13.01.2013