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

0 ответов

Другие вопросы по тегам