Personalizar el render de celdas de un jTable
Programando en java mediante netbeans 6.9.1 me he encontrado con un problema al intentar cambiar el fondo de una celda checkbox. Está claro que debemos crearnos una clase de renderizado personalizada.
En internet hay muchos ejemplos al respecto, unos extienden la clase DefaultTableCellRenderer, posiblemente funcione si para una celda muy concreta queremos aplicar un cambio. Otros ejemplos en cambio extienden un JLabel (por ejemplo) que implementa TableCellRenderer y este es el que he usado para la ocasión. El código de mi CellRenderer queda así:
Más o menos este es el renderer, pero no es menos importante como usarlo. Después de configurar el jTable debemos modificar su renderizador por defecto y sustituirlo por el nuestro. Además para que distinga correctamente si tiene que devolver un Label o un Checkbox se lo diremos en las siguientes líneas de código:
Mi error fué usar una sóla línea para asignar MiCellRenderer pasandole la clase Objeto:
Tardé todo un día en solucionarlo y comprender como funciona este lío, pero valió la pena. xD
En internet hay muchos ejemplos al respecto, unos extienden la clase DefaultTableCellRenderer, posiblemente funcione si para una celda muy concreta queremos aplicar un cambio. Otros ejemplos en cambio extienden un JLabel (por ejemplo) que implementa TableCellRenderer y este es el que he usado para la ocasión. El código de mi CellRenderer queda así:
public class MiCellRenderer extends JLabel implements TableCellRenderer {
protected int column;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
MiModelo model = (MiModelo) table.getModel();
this.column=column;
JCheckBox j=new JCheckBox();
//La tabla espera un componente, no importa si le envio this(JLabel) u otro
//Si devuelvo el jlabel podría meter iconos (ver comentarios del final)
if (value instanceof String)
{
Font f = new Font( "Helvetica",Font.ITALIC,12 );
setFont(f);
setBackground(getBackground());
setText(" "+model.getValueAt(row,column).toString());
setOpaque(true);//para que una etiqueta haga caso del color de fondo
setBackground(model.getRowColor());//amarillo
return this;
}
if (model.getValueAt(row,column).getClass().equals(Boolean.class))
{
//j.setOpaque(true);
j.setBackground(model.getRowColor());//amarillo
j.setSelected(Boolean.parseBoolean(model.getValueAt(row,column).toString()));
j.setHorizontalAlignment(SwingConstants.CENTER);
//j.setAlignmentX(j.CENTER_ALIGNMENT);
return j;
}
return this;
}
}
Más o menos este es el renderer, pero no es menos importante como usarlo. Después de configurar el jTable debemos modificar su renderizador por defecto y sustituirlo por el nuestro. Además para que distinga correctamente si tiene que devolver un Label o un Checkbox se lo diremos en las siguientes líneas de código:
jTable1.setDefaultRenderer(String.class,new MiCellRenderer());
jTable1.setDefaultRenderer(Boolean.class,new MiCellRenderer());
Mi error fué usar una sóla línea para asignar MiCellRenderer pasandole la clase Objeto:
jTable1.setDefaultRenderer(Object.class,new MiCellRenderer());
Tardé todo un día en solucionarlo y comprender como funciona este lío, pero valió la pena. xD
a mi me funciono al reves solo con jTable1.setDefaultRenderer(Object.class,new MiCellRenderer());
ResponderEliminar