我很难找到使用SwingWorker跟踪多个图像下载的正确方法。我正在编写一个GUI程序,它将图像URL列表作为输入,读取每个图像,并使用PDFBox将所有图像保存为单个PDF文件。我有一个下载程序类,使用以下方法:
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());
}}
在另一个类上,我有一个带有propertyChangeListener的SwingWorker,它正在监听它并更新一个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;
}
我希望能够在downloadImagesAsPDF方法中将SwingWorker的progress属性设置为(读取的字节数* 100 /图像的总大小)。我能想到的唯一方法是将SwingWorker对象本身作为参数传递给重写的downloadImagesAsPDF方法,但这似乎是一个错误的设计决策。
另外,有没有办法在下载方法中找到使用ImageIO.read(URL)读取的字节数?提前谢谢!