我正在尝试使用JTable
来显示我的人员列表,其中每个人的照片都是专用的。我想在JTable
单元格中显示这些图像。我实现了使用自定义单元格渲染器显示目录中的图像。该单元格渲染器通过方法new ImageIcon()
返回带有图标的标签。每当我的JTable
中发生滚动时,我猜想此渲染器都可以工作并从目录中创建新图像。因此,这会使RAM爆炸并在图像中出现故障。我阅读了与此问题有关的所有问题,但是找不到有效的解决方法。解决此问题的方法将不胜感激。
我的渲染器看起来像:
public class ImageCellRenderer extends DefaultTableCellRenderer{
JLabel lbl=new JLabel();
public Component getTableCellRendererComponent(defaultparameters){
ImageIcon imageIcon=new ImageIcon(getClass().getResource("path to directory"+table.getModel().getValueAt(row,column).toString+".jpg"));
"""
Some code to turn image icon to scaled version
"""
lbl.setIcon(imageIcon)
return lbl;
}
}
我想使用相同的ImageIcon
。
类似:
// Note: Probably don't use `DefaultTableCellRenderer`,
// unless you are using the `JLabel` part of that.
public class ImageCellRenderer extends DefaultTableCellRenderer {
private final JLabel label = new JLabel();
private final Map<String,ImageIcon> images = new HashMap<>();
public Component getTableCellRendererComponent(defaultparameters) {
ImageIcon imageIcon = images.computeIfAbsent(
value.toString(),
// No need to look value up again. Delete this:
//table.getModel().getValueAt(row,column).toString(),
cell -> {
ImageIcon newImage = new ImageIcon(
getClass().getResource("path to directory"+cell+".jpg")
);
"""
Some code to turn image icon to scaled version
"""
return newIcon;
}
);
lbl.setIcon(imageIcon)
return lbl;
}
}
(是否要在渲染器之间共享“缓存”(级别),并且将缓存逐出策略保留为练习。)