seticon导致延迟

jv4diomz  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(258)

我使用了一个自定义的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;

}

我基本上希望每次滚动列表时图像停止加载,因为这会导致应用程序严重滞后。提前谢谢。

vqlkdk9b

vqlkdk9b1#

解决方案是创建一些排序缓存,正如weisj在comment部分中已经提到的那样。
实施 hashCode() 以及 equals() 方法 Movie 如果你还没有完成的话。
现在创建缓存:

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上有很多电影,可以考虑使用弱散列Map。

jw5wzhpr

jw5wzhpr2#

您可以基于缓存图标 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;
}

相关问题