1

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) を使用して読み取ったバイト数を見つける方法はありますか?? 前もって感謝します!

4

1 に答える 1

2

にはかなりの柔軟性がありSwingWorkerます。それがあなたのデザインを決定する必要はありません。このでは、疎結合PropertyChangeListenerの は、ワーカーの への呼び出しによって間接的に生成された通知を受け取りsetProgress()ます。このでは、各ワーカーはJLabel進行状況を直接記録するためのコンポーネントへの参照を保持し、スーパーバイザー スレッドはCountDownLatch.

于 2013-06-23T21:06:56.757 に答える