Boa tarde pessoal.
Estou precisando exibir um ícone/imagem para cada registro de um JTable. Venho utilizando o ObjectTableModel do framework Towel 1.2.2 (excelente framework) e estou com algumas dúvidas para renderizar a imagem nas células da tabela.
A situação é a seguinte: Eu recebo do BD uma lista de objetos Produto, e cada um contém um atributo String nome e um atributo byte[] foto. Ao popular o ObjectTableModel com a lista de produtos, o nome do produto aparece, mas a foto não. Estava aparecendo um valor em hex (provavelmente o valor hex dos bytes). Agora consegui fazer aparecer a string de um objeto do tipo ImageIcon, mas não o ícone em si (ver imagem abaixo).
Seguindo este tópico (http://www.guj.com.br/java/211452-resolvidoobjecttablemodel-e-imageicon) eu tentei implementar um Formatter e um CellRenderer para exibir a imagem, mas sem sucesso. Gostaria de saber se alguém já passou por situação parecida ou se tem alguma idéia que possa ajudar. Segue um exemplo do que fiz até agora:
ImageFormatter.java
import com.towel.bean.Formatter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import javax.swing.ImageIcon;
public class ImageFormatter implements Formatter
{
public ImageIcon format(Object o)
{
try
{
//formata byte[] para ImageIcon
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
ObjectOutputStream oStream = new ObjectOutputStream(bStream);
oStream.writeObject(o);
ImageIcon icon = new ImageIcon(bStream.toByteArray());
return icon;
}
catch (IOException ex)
{
System.out.println("Erro no format do Formatter: " + ex.getMessage());
return null;
}
}
public String getName()
{
return "ImageFormatter";
}
public ImageIcon parse(Object o)
{
try
{
ByteArrayOutputStream bStream = new ByteArrayOutputStream();
ObjectOutputStream oStream = new ObjectOutputStream(bStream);
oStream.writeObject(o);
ImageIcon icon = new ImageIcon(bStream.toByteArray());
return icon;
}
catch (IOException ex)
{
System.out.println("Erro no parse do Formatter: " + ex.getMessage());
return null;
}
}
}
ImageCellRenderer.java
import java.awt.Component;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class ImageCellRenderer extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (value != null)
{
try
{
/*ByteArrayOutputStream bStream = new ByteArrayOutputStream();
ObjectOutputStream oStream = new ObjectOutputStream(bStream);
oStream.writeObject(value);
ImageIcon icon = new ImageIcon(bStream.toByteArray());
setText((String) value);*/
ImageIcon icon = (ImageIcon) value;
label.setIcon(icon);
}
catch (Throwable ex)
{
System.out.println("Erro: " + ex.getMessage());
}
}
return label;
}
}
Na classe Produto utilizei assim:
@Resolvable(formatter=ImageFormatter.class)
private byte[] foto;
//getters and setters
Na tabela utilizei assim:
tabela.getColumnModel().getColumn(0).setCellRenderer(new ImageCellRenderer());
Obrigado!