Я реализую Jlist, заполненный множеством элементов. Каждый элемент соответствует изображению, поэтому я хотел бы показать их предварительный просмотр в каждой строке списка. Я реализовал пользовательский ImageCellRenderer , расширяющий Jlabel, и getListCellRendererComponent я создаю миниатюру, если ее нет для этого элемента. Каждая строка соответствует классу Page , где я храню путь к изображению и значок, примененный к JLabel. Каждый Page объект помещается в DefaultListModel для заполнения JList.
Код рендеринга выглядит примерно так:
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
Page page = (Page) value;
if (page.getImgIcon() == null)
{
System.out.println(String.format("Creating thumbnail of %s", page.getImgFilename()));
ImageIcon icon = new ImageIcon(page.getImgFilename());
int thumb_width = icon.getIconWidth() > icon.getIconHeight() ? 128 : ((icon.getIconWidth() * 128) / icon.getIconHeight());
int thumb_height = icon.getIconHeight() > icon.getIconWidth() ? 128 : ((icon.getIconHeight() * 128) / icon.getIconWidth());
icon.setImage(getScaledImage(icon.getImage(), thumb_width, thumb_height));
page.setImgIcon(icon);
}
setIcon(page.getImgIcon());
}
Я думал, что в Списке виден только определенный элемент, который называется средством визуализации ячеек, но я вижу, что все thumnails создаются, когда я добавляю объект Page в модель списка. Я пытался загрузить элементы и после установки модели в JList или сначала установить модель и после начала добавления элементов, но результаты совпадают.
Есть ли способ загрузить данные только тогда, когда это необходимо, или мне нужно создать пользовательский элемент управления, например JScrollPanel, со сложенными элементами внутри, где я сам проверяю видимость каждого элемента?
Спасибо