2013-06-23 4 views
1

Мне сложно определить правильный способ использования SwingWorker для отслеживания загрузки нескольких изображений. Я пишу программу GUI, которая принимает список URL-адресов изображений в качестве входных данных, считывает каждое изображение и использует PDFBox для сохранения всех изображений в виде одного файла PDF. У меня есть класс загрузчика со следующим методом:Отслеживание хода загрузки нескольких изображений с помощью SwingWorker и JProgressBar

public void downloadImagesAsPDF(URL[] urlList, String filename){ 
    if(urlList.length == 0) 
     return; 

    //build pdf 
    try { 
     PDDocument doc = new PDDocument(); 

     for(URL imgLink : urllist){ 
      try{ 
       BufferedImage bi = ImageIO.read(imgLink); 
       int width = bi.getWidth(); 
       int height = bi.getHeight(); 

       PDPage page = new PDPage(new PDRectangle(width, height)); 
       doc.addPage(page); 

       PDXObjectImage image = new PDJpeg(doc, bi); 

       PDPageContentStream content = new PDPageContentStream(doc, page); 
       content.drawImage(image,0,0); 
       content.close(); 
      } 
      catch(Exception e){ 
       System.out.println(e.getMessage()); 
      } 
     } 
     doc.save(filename + ".pdf"); 
    } 
    catch (Exception e) { 
     System.out.println(e.getMessage()); 
    }} 

В другом классе, у меня есть SwingWorker с PropertyChangeListener слушать это и обновление JProgressBar (остальной код похож на ProgressBarDemo в учебниках, за исключением метод doInBackground):

public Void doInBackground() { 

    setProgress(0); 
    URL[] URLList = {...} 
    Downloader dl = new Downloader(); 
    dl.downloadImagesAsPDF(URLList, "some_images"); //need to track the progress inside this method.     
    return null; 
} 

Я хочу, чтобы иметь возможность установить свойство о ходе SwingWorker в рамках метода downloadImagesAsPDF как (количество прочитанных байт * 100/общего размера изображений). Единственный способ, которым я могу это сделать, - передать объект SwingWorker сам по себе как параметр переопределенного метода downloadImagesAsPDF, но это похоже на неправильное дизайнерское решение.

Также есть способ найти количество прочитанных байтов с использованием ImageIO.read (URL) внутри метода загрузки? Заранее спасибо!

ответ

2

У вас есть значительная гибкость с SwingWorker; нет необходимости позволять ему диктовать ваш дизайн. В этом example слабосвязанный PropertyChangeListener получает уведомления, опосредованные вызовом работника setProgress(). В этом example каждый рабочий имеет ссылку на компонент JLabel для непосредственного выполнения записи, тогда как поток супервизора ожидает CountDownLatch.

+0

Я получаю это, но я хочу знать, есть ли лучший способ обновить свойство Progress SwingWorker другим способом (downloadChapterAsPDF) в другом классе (загрузчик), где прогресс действительно происходит. Прямо сейчас у меня есть такой метод: downloadChapterAsPDF (urlist, filepath, swingworker), внутри которого вызывается swingworker.setProgress() для каждого байта. – banalnabutas

+0

Метод 'setProgress()' предназначен для этого; его можно вызвать в 'doInBackground()'. Поскольку свободная связь, как правило, более гибкая, добавьте свойство PropertyChangeListener в другой класс, который прослушивает обновления у рабочего. Если вам нужна более детальность, 'Downloader' должен предоставить его. – trashgod

+1

Хорошо, я понимаю, что вы имеете в виду. Я должен был прочитать больше о propertyChangeListeners. Спасибо за вашу помощь. Кстати, эта [ссылка] (http://www.vogella.com/articles/DesignPatternObserver/article.html) также помогла много. – banalnabutas