Мне сложно определить правильный способ использования 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) внутри метода загрузки? Заранее спасибо!
Я получаю это, но я хочу знать, есть ли лучший способ обновить свойство Progress SwingWorker другим способом (downloadChapterAsPDF) в другом классе (загрузчик), где прогресс действительно происходит. Прямо сейчас у меня есть такой метод: downloadChapterAsPDF (urlist, filepath, swingworker), внутри которого вызывается swingworker.setProgress() для каждого байта. – banalnabutas
Метод 'setProgress()' предназначен для этого; его можно вызвать в 'doInBackground()'. Поскольку свободная связь, как правило, более гибкая, добавьте свойство PropertyChangeListener в другой класс, который прослушивает обновления у рабочего. Если вам нужна более детальность, 'Downloader' должен предоставить его. – trashgod
Хорошо, я понимаю, что вы имеете в виду. Я должен был прочитать больше о propertyChangeListeners. Спасибо за вашу помощь. Кстати, эта [ссылка] (http://www.vogella.com/articles/DesignPatternObserver/article.html) также помогла много. – banalnabutas