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

如何将JTable中的字符串日期值传递到JDateChooser组件

这个报错的本质是你只捕获了日期解析的ParseException,异常实际是在dob.setDate(date)执行时抛出的,说明日期解析步骤没有抛出格式异常,但解析得到的Date对象不符合JDateChooser的入参要求。

常见触发原因和解决方法

  • 原因1:JTable开启了排序/过滤功能,你拿到的选中行是视图层索引,和TableModel的索引不对应,取到了错误的单元格值
    解决:调用convertRowIndexToModel方法把视图索引转换为模型索引后再取值
  • 原因2:SimpleDateFormat默认开启宽松解析,会把不存在的日期(比如2023-02-30)自动转为其他合法日期,或者解析出超出合理范围的异常日期,JDateChooser无法识别
    解决:关闭宽松解析,确保只有合法的日期字符串能被解析通过
  • 原因3:你给JDateChooser设置过最小/最大日期限制,解析得到的日期不在允许范围内
    解决:要么调整JDateChooser的日期范围限制,要么提前校验表格内的日期是否符合范围要求

修改后的参考代码

private void tableDataMouseClicked(java.awt.event.MouseEvent evt) {
    try{
        DefaultTableModel model = (DefaultTableModel) tableData.getModel();
        int selectedViewRow = tableData.getSelectedRow();
        // 视图索引转模型索引,适配排序/过滤场景
        int selectedRowIndex = tableData.convertRowIndexToModel(selectedViewRow);
        Fname.setText(model.getValueAt(selectedRowIndex,1).toString());
        Lname.setText(model.getValueAt(selectedRowIndex,2).toString());
        ageSpin.setValue(model.getValueAt(selectedRowIndex,3).toString());
        // 初始化日期格式,关闭宽松解析
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setLenient(false);
        // 先取单元格值,判空后再处理
        Object dateObj = model.getValueAt(selectedRowIndex, 4);
        if(dateObj == null) {
            dob.setDate(null);
        } else {
            String dateStr = dateObj.toString().trim(); // 去除单元格值前后可能存在的空格
            Date date = sdf.parse(dateStr);
            // 校验日期是否在JDateChooser的允许范围内
            boolean isInRange = true;
            if (dob.getMinDate() != null && date.before(dob.getMinDate())) {
                isInRange = false;
            }
            if (dob.getMaxDate() != null && date.after(dob.getMaxDate())) {
                isInRange = false;
            }
            if (isInRange) {
                dob.setDate(date);
            } else {
                // 超出范围可自定义处理逻辑,比如清空选择
                dob.setDate(null);
            }
        }
        addressField.setText(model.getValueAt(selectedRowIndex,5).toString());
        phoneNumField.setText(model.getValueAt(selectedRowIndex,6).toString());
        emailField.setText(model.getValueAt(selectedRowIndex,7).toString());
    }catch(ParseException e){
        e.printStackTrace();
        Logger.getLogger(addCitizzen.class.getName()).log(Level.SEVERE, null, e);
        // 解析失败清空日期选择器
        dob.setDate(null);
    }
}

如果修改后仍报错,可以在日期解析完成后打印date的值,确认解析结果是否符合预期,也可以打印dob.getMinDate()和dob.getMaxDate()确认范围限制是否合理。

内容的提问来源于stack exchange,提问作者user16916070

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:45:03