JList延迟加载图像

时间:2014-09-29 14:20:10

标签: swing lazy-loading jlist

因为我不是java摇摆专家,所以我需要一些帮助来理解为什么我的JList中的图像不会出现。

当用户输入搜索条件时,我弹出一个包含所有产品(带有内嵌图片)的JList。结果来自lucene,将实时呈现在JList中。

延迟加载内联产品图片我在渲染类中使用了swingworker。

任何帮助都会很棒!

public abstract class MatchRenderer implements ListCellRenderer {
   @Override
public Component getListCellRendererComponent(JList list, final Object value, int index,
        boolean isSelected, boolean cellHasFocus) {
    Component component = defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

    if (quickRenderMode) {
        return component;
    } else {
        try {
            component = renderHook(value, component);
        } catch (Exception e) {
            System.err.println("Search string: " + searchString);
            System.err.println(value.toString());
            e.printStackTrace();
        }

        JPanel itemPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JLabel label = new JLabel(defaultIcon, SwingConstants.HORIZONTAL);
        itemPanel.add(label);
        itemPanel.add(component);

        if (value instanceof QoogleEntity && ((QoogleEntity) value).isProduct()) {
            QoogleEntity qoogleItem = (QoogleEntity) value;
            String imageUrl = qoogleItem.getQInfos().get(0).getqValue();

            //LAZY LOAD STARTS HERE...
            new ImageRetriever(label, imageUrl).execute();
        }
        return itemPanel;
    }
}

protected abstract Component renderHook(Object value, Component component);

class ImageRetriever extends SwingWorker<ImageIcon, String> {
    private JLabel lbImage;
    private String imageUrl;

    public ImageRetriever(JLabel lbImage, String imageUrl) {
        this.lbImage = lbImage;
        this.imageUrl = imageUrl;
    }

    @Override
    protected void done() {
        try {
            lbImage.setIcon(get());
            lbImage.repaint();
        } catch (Exception e) {
        }
    }

    @Override
    protected ImageIcon doInBackground() throws Exception {
        return ImageLoader.loadImageFromUrl(imageUrl, 80, 80);
    }
};

0 个答案:

没有答案