Javafx 2 在JavaFX上的同一场景中多次重用同一ImageView

Javafx 2 在JavaFX上的同一场景中多次重用同一ImageView,javafx-2,Javafx 2,我正在尝试构建一个Twitter风格的ListView,但我无法在同一个列表中多次重复使用同一个ImageView。由于UI虚拟化,加载多个副本似乎是浪费,并导致滚动速度减慢。有什么解决办法吗 public class TwitterCell extends ListCell<Object> { private static HashMap<String, ImageView> images = new HashMap<String, ImageView>(

我正在尝试构建一个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));
  }
}
公共类TwitterCell扩展了ListCell{ 私有静态HashMap image=newhashmap(); @凌驾 受保护的void updateItem(对象tweet,布尔空){ super.updateItem(tweet,空); Tweet t=(Tweet)Tweet; 如果(t!=null){ String message=t.getMessage(); setText(信息); 字符串imageUrl=t.getImageUrl(); 如果(!images.containsKey(imageUrl)){ image.put(imageUrl,新的ImageView(imageUrl)); } setGraphic(images.get(imageUrl)); } }
在JavaFX中,一个场景图不能包含两次相同的
节点,而且无法克隆节点(据我所知)

一种解决方法可能是将地图设置为
HashMap
store
Image
,而不是
ImageView
,并将最后一行更改为

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

这样,您至少可以缓存实际加载的
图像
,这应该是最重要的部分。

缓存图像是一个好方法

您还可以在后台加载图像,这大大提高了性能

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

这样做:

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

尝试解释您发布的代码,以便人们可以从中学习当您有一个要复制到其他地方的源图像(src)时,您必须创建一个新图像并从源图像(src)借用图像属性;
newImage.setImage(src.getImage());
请使用上面的编辑链接而不是评论:-)谢谢