SwingWorker を使用して複数の画像のダウンロードを追跡する正しい方法を理解するのに苦労しています。画像 URL のリストを入力として受け取り、各画像を読み取り、PDFBox を使用してすべての画像を単一の PDF ファイルとして保存する GUI プログラムを作成しています。次のメソッドを持つダウンローダー クラスがあります。
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());
}}
別のクラスには、それをリッスンして JProgressBar を更新する propertyChangeListener を持つ SwingWorker があります (残りのコードは、doInBackground メソッドを除いて、チュートリアルの ProgressBarDemo と似ています)。
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 の進行状況プロパティを (読み取ったバイト数 * 100 / 画像の合計サイズ) として設定できるようにしたいと考えています。これを行う唯一の方法は、オーバーライドされた downloadImagesAsPDF メソッドに SwingWorker オブジェクト自体をパラメーターとして渡すことですが、これは設計上の決定が間違っているようです。
また、ダウンロードメソッド内で ImageIO.read(URL) を使用して読み取ったバイト数を見つける方法はありますか?? 前もって感謝します!