我正在为一个JTable设置一个自定义的单元格渲染器,它必须包含一个相册封面图像,即来自另一个库的byte[],问题是转换到BufferedImage的速度太慢了,在早期版本的代码中,程序甚至不会启动。现在情况好了,但滞后还是很明显的。以下是代码:
public class ImageCellRenderer extends DefaultTableCellRenderer {
JLabel lbl = new JLabel();
public Image[] getAlbumart() throws IOException {
Image[] albumArt = new Image[allmymusic.size()];
for (int i = 0; i < allmymusic.size(); i++) {
byte[] data = allmymusic.get(i).albumImageData;
ImageIO.setUseCache(false);
if(allmymusic.get(i).albumImageData != null){
BufferedImage bImage;
try(ByteArrayInputStream bis = new ByteArrayInputStream(data)) {
bImage = ImageIO.read(bis);
}
ImageIcon icon = new ImageIcon(bImage);
Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);
// ImageIcon iconscaled = new ImageIcon(image);
albumArt[i] = image;
} else {
albumArt[i] = null;
}
}
return albumArt ;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
ImageIcon icon = new
ImageIcon(getClass().getResource("/images/defaultimage.png"));
Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);
Image[] albumArt;
try {
albumArt = getAlbumart();
if(albumArt[row] == null){
lbl.setIcon(new ImageIcon(image));
} else {
lbl.setIcon(new ImageIcon(albumArt[row]));
}
} catch (IOException ex) {
Logger.getLogger(ImageCellRenderer.class.getName())
.log(Level.SEVERE, null, ex);
}
return lbl;
}
} 我接受其他解决办法。
发布于 2022-07-22 22:16:02
Your_JTable.getColumnModel().getColumn(0).setCellRenderer((JTable jtable, Object value, boolean bln, boolean bln1, int i1, int i2) -> {
JLabel label = new JLabel();
label.setIcon((ImageIcon) value);
return label;
});有了这个诀窍,就应该做到。它只是将选定的列设置为在其中包含一个JLabel和一个imageIcon。谢谢你@camickr提出解决方案。
发布于 2022-07-22 20:59:26
首先,我认为没有必要实例化ImageIcon对象以获取BufferedImage的缩放映像,因为这可以直接从BufferedImage本身执行:
Image image = bImage.getScaledInstance(50, 50, Image.SCALE_SMOOTH);第二种气味就在这句话里:
ImageIcon icon = new ImageIcon(getClass().getResource("/images/defaultimage.png"));
Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);由于图像是从常量静态资源中读取的,所以应该避免重复执行相同的操作:最好读取资源,只构建一次,然后将其存储在静态变量中:
private static final Image MY_STATIC_ICON=readStaticIcon();
private static Image readStaticIcon()
throws IOException
{
ImageIcon icon = new ImageIcon(MyClass.class.getResource("/images/defaultimage.png"));
Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);
return image;
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Image image = MY_STATIC_ICON;
Image[] albumArt;
try {
albumArt = getAlbumart();
...发布于 2022-07-22 21:06:48
吗?
@
@重写公共组件getTableCellRendererComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){ ImageIcon图标=新的hasFocus图像图像= icon.getImage().getScaledInstance(50、50、Image.SCALE_SMO )
2.这是非常昂贵的处理器,您能不能创建图钉并加载现成的映像,而不是像这样动态地生成图像:
Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);SwingWorker
有一本很棒的书,它将帮助您在java: Applications
https://stackoverflow.com/questions/73085820
复制相似问题