You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 16:03:36