自定义单元格渲染可防止在getListCellRendererComponent()中加载图像

时间:2015-06-12 21:08:54

标签: java swing jlist listcellrenderer

我有一个使用自定义单元格渲染器显示自定义对象(Frog)的JList。

frogList = new JList<Frog>();
frogModel = new DefaultListModel<Frog>();
frogList.setModel(frogModel);
frogList.setCellRenderer(new FrogBrowserCellRenderer());
//add frogs...

青蛙对象包含一个图像列表,我的列表选择了要显示的最新图像。它位于缩略图文件中,因此我可以将其读入内存并显示它。但是我知道每次窗口移动或窗口需要重绘时JList都会重新渲染,而非常糟糕的性能只是不好的设计。我遇到的问题是这个列表是动态的,所以我不能简单地在启动时加载所有图像,因为用户可以在运行时添加它们,它会自动更新列表。

有些人提到在构造函数中将图像加载到内存中并在getListCellRendererComponent()方法中设置它,但这看起来不可能,因为它只创建一个单元格渲染器并将其用于名单。我还通过打印构造函数方法验证了这一点。由于我将有一份包含所有不同图像的青蛙清单,因此这并不合理。

以下是我现在用于创建缩略图的代码。

public Image createListThumbnail() {
    try {
        Image returnImg = null;
        //get latest frog image
        SiteImage img = frog.getLatestImage();
        BufferedImage src = ImageIO.read(new File(XMLFrogDatabase.getImagesFolder()+img.getImageFileName()));
        BufferedImage thumbnail = Scalr.resize(src, Scalr.Method.SPEED, Scalr.Mode.FIT_TO_WIDTH, 200, 150, Scalr.OP_ANTIALIAS);
        if (!frog.isFullySearchable()){
            ImageFilter filter = new GrayFilter(true, 30);  
            ImageProducer producer = new FilteredImageSource(thumbnail.getSource(), filter);  
            returnImg = Toolkit.getDefaultToolkit().createImage(producer);  
        }
        return returnImg;
    } catch (IOException e) {
        IdentiFrog.LOGGER.writeExceptionWithMessage("Unable to generate thumbnail for image (in memory).", e);
    }
    return null;
}

我在getListCellRendererComponent()中调用了这个方法,我知道这会导致糟糕的表现,但我不知道如何将它缓存在内存中以供多个青蛙使用,并且只使用一个对象。也许是图像地图?我似乎无法找到任何正确的方法来做到这一点。

0 个答案:

没有答案