如何将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
相关产品推荐
相关产品推荐

