在JavaFX上的同一场景中多次重复使用相同的ImageView

时间:2013-03-02 13:29:38

标签: javafx-2

我正在尝试构建一个Twitter风格的ListView,我无法在同一个列表中多次重复使用相同的ImageView。加载多个副本似乎是浪费,并且由于UI虚拟化导致滚动速度变慢。有没有解决方法?

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));
  }
}

3 个答案:

答案 0 :(得分:5)

在JavaFX中,场景图形不能包含两次相同的Node,并且无法克隆节点(据我所知)。

解决方法可能是让您的地图成为HashMap商店Image而不是ImageView,并将最后一行更改为

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

这样你至少可以缓存实际Image的加载,这实际上应该是繁重的部分。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

做这样的事情:

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