我有一个使用自定义单元格渲染器显示自定义对象(青蛙)的 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()
我知道它会导致糟糕的性能,但我不明白如何将它缓存在内存中以供多只青蛙使用,并且只使用一个对象。也许是图像地图?我似乎找不到任何确凿的证据证明这样做的正确方法。