1

我很难找出使用 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 的进度属性设置为(读取的字节数 * 100 / 图像的总大小)。我能想到的唯一方法是将 SwingWorker 对象本身作为参数传递给重写的 downloadImagesAsPDF 方法,但这似乎是一个错误的设计决定。

另外,有没有办法在下载方法中使用 ImageIO.read(URL) 找到读取的字节数?提前致谢!

4

1 回答 1

2

你有相当大的灵活性SwingWorker; 没有必要让它决定你的设计。在此示例中,松散耦合PropertyChangeListener接收由工作人员调用间接生成的通知setProgress()。在这个例子中,每个工作线程都持有一个组件的引用,JLabel用于直接记录进度,而主管线程等待一个CountDownLatch.

于 2013-06-23T21:06:56.757 回答