基于JXDatePicker的TableCellEditor选日期后不切换至Renderer的问题
解决JXDatePicker编辑器未切换、数据不同步问题
一、让JXDatePicker主动触发编辑结束
JXDatePicker不会自动通知JTable结束编辑,必须给它添加监听器,在日期变更时主动触发编辑完成逻辑:
- 在自定义
TableCellEditor的getTableCellEditorComponent方法中,给日期选择器绑定监听器:@Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { JXDatePicker datePicker = new JXDatePicker(); if (value instanceof Date) { datePicker.setDate((Date) value); } // 监听日期属性变化,任何日期变更都触发编辑结束 datePicker.addPropertyChangeListener("date", evt -> { stopCellEditing(); }); // 监听确认按钮点击(若有) datePicker.addActionListener(e -> { stopCellEditing(); }); return datePicker; } - 正确实现
stopCellEditing方法,确保数据提交并通知表格:@Override public boolean stopCellEditing() { JXDatePicker picker = (JXDatePicker) getComponent(); setCellEditorValue(picker.getDate()); fireEditingStopped(); // 通知表格编辑完成,同步数据到模型 return true; }
二、确保表格模型能处理日期数据
- 自定义
TableModel的setValueAt方法要正确接收Date类型数据:@Override public void setValueAt(Object value, int row, int column) { final int DATE_COL = 1; // 替换为你的日期列索引 if (column == DATE_COL && value instanceof Date) { // 假设yourDataList是存储表格数据的集合 yourDataList.get(row).setDate((Date) value); fireTableCellUpdated(row, column); // 通知表格更新视图 } } - 重写
getColumnClass方法,让日期列返回Date.class,确保表格匹配对应的编辑器和渲染器:@Override public Class<?> getColumnClass(int columnIndex) { final int DATE_COL = 1; if (columnIndex == DATE_COL) { return Date.class; } return super.getColumnClass(columnIndex); }
三、正确绑定编辑器和渲染器
- 可按类型全局绑定,或针对指定列绑定:
// 全局绑定:所有Date类型列使用该编辑器和渲染器 table.setDefaultEditor(Date.class, new YourDateTableCellEditor()); table.setDefaultRenderer(Date.class, new YourDateRenderer()); // 单列绑定 int dateColumnIndex = 1; table.getColumnModel().getColumn(dateColumnIndex).setCellEditor(new YourDateTableCellEditor()); table.getColumnModel().getColumn(dateColumnIndex).setCellRenderer(new YourDateRenderer());
四、额外排查点
- 检查表格的
cellSelectionEnabled是否为true,确保切换单元格时能触发编辑结束。 - 在
stopCellEditing和模型的setValueAt方法中添加日志,确认方法是否被调用,排查数据流向问题。
内容的提问来源于stack exchange,提问作者Eljah
相关产品推荐
相关产品推荐

