CellRenderer 中的 SetIcon 导致延迟
SetIcon in CellRenderer causing lag
我正在使用带有列表的自定义 listcellrenderer 并设置标题和图像,但它真的很慢,因为每次滚动时图像都会加载。有什么办法可以解决这个问题吗?
这是我的代码:
@Override
public Component getListCellRendererComponent(JList<? extends Movie> list, Movie value, int index, boolean isSelected, boolean cellHasFocus) {
this.titleHolder.setText(value.getTitle());
this.imageHolder.setIcon(new ImageIcon(value.getPoster()));
return this;
}
我基本上希望每次滚动列表时图像都停止加载,因为它会导致应用程序严重滞后。提前致谢。
解决方案是创建某种缓存,正如 weisj 在评论部分已经提到的那样。
实施 Movie
class 的 hashCode()
和 equals()
方法(如果您尚未实施)。
现在创建缓存:
private Map<Movie,ImageIcon> moviePostersCache = new HashMap<>();
然后,在getListCellRendererComponent
里面:
@Override
public Component getListCellRendererComponent(JList<? extends Movie> list, Movie value, int index,
boolean isSelected, boolean cellHasFocus) {
this.titleHolder.setText(value.getTitle());
if (!moviePostersCache.containsKey(value))
moviePostersCache.put(value, new ImageIcon(value.getPoster()));
this.imageHolder.setIcon(moviePostersCache.get(value));
return this;
}
并且海报将被记住。第一次渲染后,它们不会被“重新加载”——Movie#getPoster
不会被调用。
现在,如果有很多电影来去去gui,可以考虑using a weak hash map。
您可以缓存基于 Movie#getTitle
的图标(我假设它是类型 String
。
private Map<String, Icon> iconCache = new HashMap<>();
@Override
public Component getListCellRendererComponent(JList<? extends Movie> list, Movie value, int index, boolean isSelected, boolean cellHasFocus) {
this.titleHolder.setText(value.getTitle());
this.imageHolder.setIcon(iconCache.computeIfAbsent(value.getPoster(), ImageIcon::new));
return this;
}
我正在使用带有列表的自定义 listcellrenderer 并设置标题和图像,但它真的很慢,因为每次滚动时图像都会加载。有什么办法可以解决这个问题吗? 这是我的代码:
@Override
public Component getListCellRendererComponent(JList<? extends Movie> list, Movie value, int index, boolean isSelected, boolean cellHasFocus) {
this.titleHolder.setText(value.getTitle());
this.imageHolder.setIcon(new ImageIcon(value.getPoster()));
return this;
}
我基本上希望每次滚动列表时图像都停止加载,因为它会导致应用程序严重滞后。提前致谢。
解决方案是创建某种缓存,正如 weisj 在评论部分已经提到的那样。
实施 Movie
class 的 hashCode()
和 equals()
方法(如果您尚未实施)。
现在创建缓存:
private Map<Movie,ImageIcon> moviePostersCache = new HashMap<>();
然后,在getListCellRendererComponent
里面:
@Override
public Component getListCellRendererComponent(JList<? extends Movie> list, Movie value, int index,
boolean isSelected, boolean cellHasFocus) {
this.titleHolder.setText(value.getTitle());
if (!moviePostersCache.containsKey(value))
moviePostersCache.put(value, new ImageIcon(value.getPoster()));
this.imageHolder.setIcon(moviePostersCache.get(value));
return this;
}
并且海报将被记住。第一次渲染后,它们不会被“重新加载”——Movie#getPoster
不会被调用。
现在,如果有很多电影来去去gui,可以考虑using a weak hash map。
您可以缓存基于 Movie#getTitle
的图标(我假设它是类型 String
。
private Map<String, Icon> iconCache = new HashMap<>();
@Override
public Component getListCellRendererComponent(JList<? extends Movie> list, Movie value, int index, boolean isSelected, boolean cellHasFocus) {
this.titleHolder.setText(value.getTitle());
this.imageHolder.setIcon(iconCache.computeIfAbsent(value.getPoster(), ImageIcon::new));
return this;
}