2013-03-02 1 views
3

Я пытаюсь создать ListView в стиле Twitter, и я не мог повторно использовать один и тот же ImageView несколько раз в том же списке. Загрузка нескольких копий кажется расточительной и приводит к замедлению прокрутки из-за виртуализации пользовательского интерфейса. Есть ли обходные пути?Повторное использование одного и того же ImageView несколько раз в одной сцене на JavaFX

public class TwitterCell extends ListCell<Object> { 

private static HashMap<String, ImageView> images = new HashMap<String, ImageView>(); 

@Override 
protected void updateItem(Object tweet, boolean empty) { 
    super.updateItem(tweet, empty); 
    Tweet t = (Tweet) tweet; 
    if (t != null) { 
    String message = t.getMessage(); 
    setText(message); 
    String imageUrl = t.getImageUrl(); 
    if (!images.containsKey(imageUrl)) { 
     images.put(imageUrl, new ImageView(imageUrl)); 
    } 
    setGraphic(images.get(imageUrl)); 
    } 
} 

ответ

5

дерево сцена не может содержать один и тот же узел дважды в JavaFX, и нет никакого способа клонирования узлов (насколько я знаю).

Обходной бы, возможно, чтобы сделать вашу карту HashMap магазин изображения вместо ImageView и измените последнюю строку

setGraphic(new ImageView(images.get(imageUrl))); 

Таким образом, вы по крайней мере кэшировать загрузку фактического изображения, которые действительно должна быть тяжелая подъемная часть.

0

Кэширование изображений - это хороший способ.

Также вы можете загружать изображения в фоновом режиме, что значительно повышает производительность.

public Image getImage(String path, boolean backload) { 
    image = imageCache.get(path); 
    if (image == null) { 
     image = new Image(path, backload); 
     imageCache.put(path, image); 
    } 
    return image; 
} 
0

ли что-то вроде этого:

ImageView image = ... 
ImageView src = ... 
image.setImage(src.getImage()); 
+1

Пытаться объяснить код вы размещаете, чтобы люди могли узнать из него – LionC

+1

Если у вас есть исходный файл (ЦСИ), который вы хотите продублировать в другом месте, то вам необходимо создать новый образ и заимствовать свойство _image_ из источника (src). 'ImageView'' newImage' '=' 'new'' ImageView(); '' newImage.setImage (src.getImage()); ' –

+2

Пожалуйста, используйте ссылку для редактирования выше, а не комментируя :-) Спасибо –

Смежные вопросы