Java 使用SwingWorker和JProgressBar跟踪多个图像下载的进度

Java 使用SwingWorker和JProgressBar跟踪多个图像下载的进度,java,swing,user-interface,swingworker,jprogressbar,Java,Swing,User Interface,Swingworker,Jprogressbar,我很难找到使用SwingWorker跟踪多个图像下载的正确方法。我正在编写一个GUI程序,它将图像URL列表作为输入,读取每个图像,并使用PDFBox将所有图像保存为单个PDF文件。我有一个具有以下方法的downloader类: public void downloadImagesAsPDF(URL[] urlList, String filename){ if(urlList.length == 0) return; //build pdf try {

我很难找到使用SwingWorker跟踪多个图像下载的正确方法。我正在编写一个GUI程序,它将图像URL列表作为输入,读取每个图像,并使用PDFBox将所有图像保存为单个PDF文件。我有一个具有以下方法的downloader类:

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(除doInBackground方法外,其余代码类似于教程中的ProgressBarDemo):

我希望能够将downloadImagesAsPDF方法中SwingWorker的progress属性设置为(读取的字节数*100/图像的总大小)。我能想到的唯一方法是将SwingWorker对象本身作为参数传递给重写的downloadImagesAsPDF方法,但这似乎是一个错误的设计决策


另外,是否有一种方法可以在下载方法中使用ImageIO.read(URL)查找读取的字节数??提前谢谢

您对SwingWorker有相当大的灵活性;没有必要让它支配你的设计。在这种情况下,松散耦合的
PropertyChangeListener
接收工作人员调用
setProgress()
间接生成的通知。在这种情况下,每个worker持有对组件
JLabel
的引用,以便直接记录进度,而主管线程则等待
CountDownLatch

我明白了,但我想知道是否有更好的方法在另一个类(downloader)的另一个方法(downloadchaptersdpf)中更新SwingWorker的进度属性实际发生进展的地方。现在我有一个这样的方法:downloadChapterAspf(urlist,filepath,swingworker),其中swingworker.setProgress()对于读取的每个字节都被调用;它可以在
doInBackground()
中调用。由于松耦合通常更灵活,因此在另一个类中添加一个
propertychangelister
,用于侦听来自工作程序的更新。如果您需要更高的粒度,
Downloader
必须提供它。好的,我明白您的意思。我应该读更多关于propertyChangeListeners的内容。谢谢你的帮助。顺便说一句,这也有很大帮助。
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;
}