Question

I have a column in a JTable with cells rendered as checkboxes below:

enter image description here

How do I prevent the checkboxes from moving every time I click on it? Here is my cell renderer and cell editor:

protected class CheckBoxCellRenderer extends JCheckBox implements TableCellRenderer {

  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    this.setSelected((Boolean) tableModel.getValueAt(row, 0));
    return this;
  }

}

protected class CheckBoxCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {

  private final CheckBoxCellRenderer cell = new CheckBoxCellRenderer();
  private int row;

  public CheckBoxCellEditor() {
    cell.addActionListener(this);
  }

  @Override
  public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int vColIndex) {
    cell.setSelected(((Boolean) value).booleanValue());
    row = rowIndex;
    return cell;
  }

  @Override
  public Object getCellEditorValue() {
    return cell.isSelected();
  }

}

Thanks!

Was it helpful?

Solution

Don't create a custom renderer/editor.

JTable already supports a default renderer. Just override the getColumnClass(...) method of the TableModel or JTable to return Boolean.class for the first column and the JTable will use the default renderer/editor.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top