Javafx 2 在JavaFX上的同一场景中多次重用同一ImageView
我正在尝试构建一个Twitter风格的ListView,但我无法在同一个列表中多次重复使用同一个ImageView。由于UI虚拟化,加载多个副本似乎是浪费,并导致滚动速度减慢。有什么解决办法吗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>(
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
storeImage
,而不是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());
请使用上面的编辑链接而不是评论:-)谢谢