0

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?

puneet
  • 79
  • 1
  • 7
  • There's no need to keep calling `testTable.getColumnModel().getColumn(0).setXxx` each time you add a row – MadProgrammer Mar 02 '17 at 22:26
  • I'm not sure triggering `fireTableCellUpdated` inside the editor is good idea, as a general rule, you shouldn't call these methods outside of the conext of the model – MadProgrammer Mar 02 '17 at 22:28
  • I did those changes.. but still no luck – puneet Mar 02 '17 at 22:46
  • This complete [example](http://stackoverflow.com/a/7694802/230513) seems to work as expected. – trashgod Mar 02 '17 at 23:46
  • There is an issue in that the date change from the date chooser does not reflect in the jtable model.. and if I override the propertyChange listner then the above issue occurs. – puneet Mar 03 '17 at 09:08

0 Answers0