JTable: Editores y Renders

LOD
26 de Febrero del 2006
Hola,
tengo una tabla en la cual una columna muestra un valor Boolean.
Lo que quiero hacer es en vez de poner solo 1 checkbox como hace por defecto la JTable, quiero poner dos Checkbox en un CheckboxGroup.
Esto es lo que hago:
miTabla.setDefaultRenderer(Boolean.class,new TableCellRenderer(){
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column){

CheckboxGroup checkboxGroup = new CheckboxGroup();
Checkbox aprobado = new Checkbox("Aprobado");
Checkbox noAprobado = new Checkbox("No aprobado");
aprobado.setCheckboxGroup(checkboxGroup);
noAprobado.setCheckboxGroup(checkboxGroup);

if(value != null)
{
if(((Boolean)value).booleanValue()== true)
// checkboxGroup.setSelectedCheckbox(aprobado);
aprobado.setState(true);
else
// checkboxGroup.setSelectedCheckbox(noAprobado);
noAprobado.setState(true);
}
JPanel panel = new JPanel();
panel.add(aprobado);
panel.add(noAprobado);
return panel;
}
});

y para el editor pongo:
listaDeGruposJTable.setDefaultEditor(Boolean.class,new GrupoTableCellEditor());

donde GrupoTableCellEditor es una subclase de AbstractCellEditor, implementa TableCellEditor y tiene dos metodos:
getTableCellEditorComponent que es igual al del render que puse arriba.
y este otro:
public Object getCellEditorValue() {
return null;
}
Todo esto funciona a medias porque pasan dos cosas que no entiendo:
Primero y tal vez mas problematico: En la columna no me muestra nada, para ver algo tengo que hacer click sobre la celda.
2) Cuando hago click en la celda me muestra dos radiobutton en vez de dos checkbox y el que esta seleccionado depende de lo que devuelva el metodo getCellEditorValue de GrupoTableCellEditor: si devuelve null ninguna esta seleccionada, si devuelve true se selecciona la que dice "aprobado" y si devuelve false se selecciona la que dice "no aprobado".

Mi pregunta es: estoy trabajando bien con los editores y renders??
Segun entiendo el metodo getCellEditorValue debe devolver el valor actual de la celda, pero eso depende de lo que tenga el modelo de datos de la tabla cosa que no tengo desde ahi.
La verdad me parece demasiado complicado, no? seria mas facil colocarlo en dos columnas y en los editores emular el comportamiento del checkboxgroup?
Todo esto es para poder poner el valor en sus 3 estados posibless: true, false y null.

Saludos.

chuidiang
26 de Febrero del 2006
Hola:

Ten en cuenta que el JTable relaciona muy estrechamente tu editor y tu render.

Cuando inicialmente el Boolean es null, ese null es lo que le pasan a tu render. En caso de que sea null, tu render devuelve el panel con los checks vacios.

Lo que devuelva tu editor será lo que se le pase al render y lo que haga el render será lo que se pinte. Si tu editor devuelve true, tu estas poniendo en el render un check a true y dejas el otro en false. Si tu editor devuelve false, tu estas poniendo en el render los checks al revés.

Además lo que devuelva tu editor será lo que posteriormente se le pase cuando se vuelva a editar.

El tema de los radiobuttons supongo que es por meterlos en un checkboxgroup que debe cambiarlos. Prueba a cambiar el checkboxgroup pon un JPanel normal a ver qué pasa.

Se bueno.