如何无需点击确认按钮设置Jfxtras LocalDateTimeTextField的值?
解决LocalDateTimeTextField弹窗关闭时自动应用所选值的问题
我明白你的需求:点击LocalDateTimeTextField弹出选择器后,选择新的日期时间,不用点击确认按钮,只要关闭弹窗(点击外部区域),就自动把选中的值同步到文本框里。针对这个问题,我们可以通过监听弹窗的隐藏事件来实现,下面是具体的解决方法:
核心思路
LocalDateTimeTextField(来自ControlsFX库)内部依赖LocalDateTimePicker组件提供弹窗选择功能。我们可以获取到这个内部的LocalDateTimePicker,然后监听它的弹窗隐藏事件,在弹窗关闭时主动将选中的日期时间设置到文本框中。
代码实现
在你初始化dtSpecificDate的代码后,添加以下逻辑:
// 初始化你的LocalDateTimeTextField dtSpecificDate = new LocalDateTimeTextField(); dtSpecificDate.withLocalDateTime(LocalDateTime.now()); dtSpecificDate.setMaxWidth(170.0); dtSpecificDate.setDisable(true); // 注意:如果控件是禁用状态,可能需要调整逻辑确保弹窗能正常弹出 dtSpecificDate.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")); gridRadioGroup.add(dtSpecificDate, 1, 1); // 获取内部的LocalDateTimePicker组件 LocalDateTimePicker picker = (LocalDateTimePicker) dtSpecificDate.getEditor().getProperties().get("DateTimePicker"); if (picker != null) { // 监听弹窗的隐藏事件 picker.getPopup().setOnHidden(event -> { LocalDateTime selectedDateTime = picker.getValue(); // 确保选中的值不为空,且与当前文本框值不同时再设置 if (selectedDateTime != null && !selectedDateTime.equals(dtSpecificDate.getLocalDateTime())) { dtSpecificDate.setLocalDateTime(selectedDateTime); } }); }
额外说明
- 禁用状态的注意事项:你的代码里设置了
dtSpecificDate.setDisable(true);,如果控件处于完全禁用状态,弹窗可能无法正常触发。如果需要保持禁用但允许用户通过弹窗选择,可以改为只禁用文本框的手动输入,保留弹窗触发功能。 - Cancel按钮的行为:默认情况下,点击弹窗的Cancel按钮会重置选中值为文本框原有的值。如果你希望Cancel按钮也应用当前选中的值,可以在
setOnHidden事件里直接设置选中值,忽略Cancel的重置逻辑。 - 替代方案:实时同步:如果你希望用户在弹窗里选择时文本框就实时更新,可以监听
picker.valueProperty()的变化:if (picker != null) { picker.valueProperty().addListener((obs, oldVal, newVal) -> { if (newVal != null) { dtSpecificDate.setLocalDateTime(newVal); } }); }
这样就能实现你想要的效果:弹窗关闭时无需点击确认,自动将所选值设置到LocalDateTimeTextField组件中。
内容的提问来源于stack exchange,提问作者drCracker
相关产品推荐
相关产品推荐

