Пользовательский рендеринг ячейки предотвращает загрузку изображения в getListCellRendererComponent()
У меня есть JList, который отображает пользовательский объект (Frog) с помощью пользовательского средства визуализации ячеек.
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()
Я знаю, что это приводит к ужасной производительности, но я не понимаю, как кэшировать ее в памяти для нескольких лягушек, а также использовать только один объект. Возможно карта изображения? Кажется, я не могу найти каких-либо убедительных доказательств правильного способа сделать это.