ControlsFX SpreadsheetView DateCell无效输入退出编辑问题求助
解决ControlsFX SpreadsheetView日期单元格输入无效值后退出编辑模式的问题
你碰到的这个问题确实是ControlsFX中Date类型SpreadsheetCellType的一个实现瑕疵——和Integer类型的处理逻辑不一致,导致无效输入时的行为不符合文档描述。
问题现象回顾
- 整数单元格:输入"abcd"这类无效值按回车,编辑器保持编辑状态,符合
SpreadsheetCellType.match(Object)方法定义的验证规则预期; - 日期单元格:输入无效日期(比如"2023/13/01")或任意非日期字符串按回车,单元格会直接退出编辑模式并恢复为旧值,这和我们期望的「验证失败时保持编辑状态」不符。
解决思路与代码实现
核心问题在于原生DateCellType的编辑器没有在提交前严格验证输入有效性,导致无效值触发了默认的回滚行为。我们可以通过自定义一个修复后的DateCellType来解决:
import java.time.LocalDate; import org.controlsfx.control.spreadsheet.SpreadsheetCell; import org.controlsfx.control.spreadsheet.SpreadsheetCellType; import javafx.scene.control.DatePicker; import javafx.scene.control.TextField; import javafx.scene.control.cell.TextFieldTableCell; public class FixedDateCellType extends SpreadsheetCellType.LocalDateType { @Override public TextField createEditor(SpreadsheetCell cell) { DatePicker datePicker = (DatePicker) super.createEditor(cell); TextField textField = datePicker.getEditor(); // 覆盖默认的提交逻辑,先验证输入有效性 textField.setOnAction(event -> { String input = textField.getText(); if (!match(input)) { // 输入无效,阻止提交事件,保持编辑状态 event.consume(); // 可选:给用户视觉提示,比如设置红色边框 textField.setStyle("-fx-border-color: #ff4444;"); } else { // 输入有效,清除提示样式并正常提交 textField.setStyle(""); TextFieldTableCell.commitEdit(datePicker, getConverter().fromString(input)); } }); return datePicker; } @Override public boolean match(Object value) { if (value == null) { return true; } if (value instanceof LocalDate) { return true; } if (value instanceof String) { try { // 尝试转换字符串为LocalDate,失败则返回false getConverter().fromString((String) value); return true; } catch (Exception e) { return false; } } return false; } }
使用方法
把你示例代码中创建日期单元格的代码替换为自定义类型即可:
// 替换原来的SpreadsheetCellType.DATE list.add(new FixedDateCellType().createCell(row, column, 1, 1, LocalDate.now()));
原理说明
- 重写
match方法:确保字符串输入会被严格验证,只有能转换为有效LocalDate的输入才返回true; - 重写
createEditor方法:覆盖编辑器的提交事件逻辑,当match验证失败时,消费掉提交事件,阻止单元格退出编辑模式,同时可以给用户添加视觉提示。
这样修改后,日期单元格的行为就会和整数单元格保持一致——输入无效值按回车时,编辑器会保持编辑状态,直到输入符合要求的日期格式为止。
内容的提问来源于stack exchange,提问作者Marco Grabmüller
相关产品推荐
相关产品推荐

