I have a jtable with a JDateChooser column. I have used the below render and CellEditor impls.
Rnederer
class JDateChooserRenderer extends JDateChooser implements TableCellRenderer {
public JDateChooserRenderer(JDateChooser dateChooser) {
if (dateChooser != null) {
this.setDate(dateChooser.getDate());
}
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Date) {
this.setDate((Date) value);
} else if (value instanceof String) {
}
return this;
}
}
Editor
class JDateChooserCellEditor extends AbstractCellEditor implements
TableCellEditor {
private static final long serialVersionUID = 917881575221755609L;
private JDateChooser dateChooser = new JDateChooser();
private AbstractTableModel model;
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, final int row, final int column) {
try {
model = (AbstractTableModel) table.getModel();
} catch (Exception e) {
};
dateChooser.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
String pname = evt.getPropertyName();
if ("date".equals(pname)) {
try {
model.fireTableCellUpdated(row, column);
} catch (Exception e) {
};
}
}
});
return dateChooser;
}
@Override
public Object getCellEditorValue() {
return dateChooser.getDate();
}
}
Data Population
private void initCustomComponents() {
addRow();
addRow();
}
private void addRow() {
DefaultTableModel model = (DefaultTableModel) testTable.getModel();
Date date = new Date();
JDateChooser dateChooser = new JDateChooser();
model.addRow(new Object[]{date});
testTable.getColumnModel().getColumn(0).setCellRenderer(new JDateChooserRenderer(dateChooser));
testTable.getColumnModel().getColumn(0).setCellEditor(new JDateChooserCellEditor());
}
The above test code is populating the jdatechooser table with two date rows., however whenever I edit one of the dates and then click on the other date, the other date gets updated to the value that i changed for the previous row. What changes needs to be made to make the date changes reflect only at row level and not column level?