Hi!
I have a table with two rows the left uneditable and the right editable.
The right side render different values for each row-cell so the content of the cells differs between ints,strings booleans and so forth.
Here comes my problem. I want my boolean values to be rendered as a JComboBox instead of the default checkbox.
I have written a renderer and editor for this purpose which works to a certain extent. When you first enter the application the cell is rendered correct(JComboBox) but as you try to edit the field it re-renders it to a String. Anyone who could help me? Because i am stuck and can't seem to get myself out of this little hole i dug for myself.
First i override the DefaultTableModel with the following changes:
String values[] = {"true","false"};
public TableCellRenderer getCellRenderer(int row, int column) {
editingClass = null;
int modelColumn = convertColumnIndexToModel(column);
System.out.println("getCellRenderer");
if (modelColumn == 1) {
if (getModel().getValueAt(row, modelColumn) == null) {
System.out.println("null at cellRenderer");
System.out.println(row + " : " + column);
}
Class rowClass = getModel().getValueAt(row, modelColumn).getClass();
if (getModel().getValueAt(row, modelColumn) instanceof Number) {
return new NumberRenderer();
} else if (getModel().getValueAt(row, modelColumn) instanceof String) {
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
renderer.setHorizontalAlignment(JLabel.RIGHT);
return renderer;
}else if (getModel().getValueAt(row, modelColumn) instanceof Boolean) {
return new BolRenderer(values);
}
return getDefaultRenderer(rowClass);
} else {
return super.getCellRenderer(row, column);
}
}
public TableCellEditor getCellEditor(int row, int column) {
editingClass = null;
int modelColumn = convertColumnIndexToModel(column);
System.out.println("getCellEditor");
if (modelColumn == 1) {
if(getModel().getValueAt(row, modelColumn) instanceof Boolean)
return new BolEditor(values);
else
editingClass = getModel().getValueAt(row, modelColumn).getClass();
return getDefaultEditor(editingClass);
} else {
return super.getCellEditor(row, column);
}
}
public Class getColumnClass(int column) {
System.out.println("getColumnClass");
return editingClass != null ? editingClass : super.getColumnClass(column);
}
The Boleditor
public class BolEditor extends DefaultCellEditor{
public BolEditor(String[] items) {
super(new JComboBox(items));
}
}
BolRenderer
public class BolRenderer extends JComboBox implements TableCellRenderer {
public BolRenderer(String[] values){
super(values);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected,
boolean hasFocus,
int row, int column) {
if(Boolean.TRUE.equals(value)){
/*this.setSelectedItem(value);
this.setSelectedIndex(0);
*/
}else{
/*
this.setSelectedItem(value);
this.setSelectedIndex(1);
*/
}
return this;
}
}
As I see it, it's my inability to write a proper renderer and editor which is the real problem so if someone could help me it would be really great! Thanks!