是否有一种异步方式下载带有图像图标和URL的图像?



当我从URL获取图像时,我找不到在下载时显示加载图标的方法。这是我的方法:

    private void fetchAdImage(String clickedLink) {
        try {
            // This gets completely ignored /
            adDisplayLabel.setIcon(new ImageIcon(MainFrame.class.getResource("/icons/spinner.png")));
            // /
            URL link = new URL(clickedLink);
            ImageIcon adImage = new ImageIcon(link, "");
            int difference;
            if (adImage.getIconHeight() > adDisplayLabel.getHeight()) {
                difference = adImage.getIconHeight() + adDisplayLabel.getHeight();
            } else {
                difference = adImage.getIconHeight() - adDisplayLabel.getHeight();
            }
            adDisplayLabel.setIcon(drawBorder(Tools.getResizedIcon(adImage, adImage.getIconWidth() - difference, adDisplayLabel.getHeight())));
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

这个想法是在"onPreUpdate"阶段将JLabel的图标更改为"微调器"图像,并在"onSuccess"阶段更改为下载的图像。问题是:这种下载方法没有这样的事情,前面的语句被完全忽略了。有没有异步方式在 Java 中下载图像?

由于@Slaw的建议(将代码包装在 Swingworker 中,一个我不知道的类(,我设法解决了这个问题。代码如下:

    private void fetchAdImage(String clickedLink) {
        try {
            SwingWorker<ImageIcon, Void> worker = new SwingWorker<ImageIcon, Void>() {
                ImageIcon adImage;
                int difference;
                @Override
                protected ImageIcon doInBackground() throws Exception {
                    adDisplayLabel.setIcon(new ImageIcon(MainFrame.class.getResource("/icons/spinner.png")));
                    URL link = new URL(clickedLink);
                    adImage = new ImageIcon(link, "");
                    if (adImage.getIconHeight() > adDisplayLabel.getHeight()) {
                        difference = adImage.getIconHeight() + adDisplayLabel.getHeight();
                    } else {
                        difference = adImage.getIconHeight() - adDisplayLabel.getHeight();
                    }
                    return adImage;
                }
                protected void done() {
                    adDisplayLabel.setIcon(drawBorder(Tools.getResizedIcon(adImage, adImage.getIconWidth() - difference, adDisplayLabel.getHeight())));
                }
            };
            worker.execute();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

最新更新