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