JavaFX JFoenix DatePicker能否设置为仅选择年月不显示具体日期?
JFoenix DatePicker 仅选择年月实现方案
核心实现逻辑是修改日期格式化规则、隐藏日选择面板、拦截选择事件直接返回选中的年月,具体步骤如下:
- 第一步:为JFXDatePicker设置自定义字符串转换器,仅显示年月格式
import java.time.LocalDate; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import javafx.util.StringConverter; import com.jfoenix.controls.JFXDatePicker; jfxDatePicker.setConverter(new StringConverter<LocalDate>() { private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM"); @Override public String toString(LocalDate date) { if (date != null) { return formatter.format(date); } return ""; } @Override public LocalDate fromString(String string) { if (string != null && !string.trim().isEmpty()) { // 日期默认取当月第一天,仅做存储用 return LocalDate.parse(string + "-01", DateTimeFormatter.ofPattern("yyyy-MM-dd")); } return null; } });
- 第二步:添加弹窗显示监听,隐藏日选择区域,监听年月选择事件直接赋值
import com.jfoenix.skins.JFXDatePickerSkin; import com.jfoenix.controls.cells.editors.DatePickerContent; jfxDatePicker.setOnShowing(event -> { JFXDatePickerSkin skin = (JFXDatePickerSkin) jfxDatePicker.getSkin(); DatePickerContent content = (DatePickerContent) skin.getPopupContent(); // 隐藏日选择网格 content.getChildrenUnmodifiable().forEach(node -> { if (node.getStyleClass().contains("day-cell-grid")) { node.setVisible(false); node.setManaged(false); } }); // 监听年月选择事件,选中后直接关闭弹窗 content.selectedYearMonthProperty().addListener((obs, oldVal, newVal) -> { if (newVal != null) { jfxDatePicker.setValue(LocalDate.of(newVal.getYear(), newVal.getMonth(), 1)); jfxDatePicker.hide(); } }); });
- 第三步(可选):添加全局CSS样式,彻底屏蔽日选择区域的渲染
.jfx-date-picker .day-cell-grid { visibility: hidden !important; max-height: 0 !important; -fx-pref-height: 0 !important; }
注意:该实现基于JFoenix 9.x/17.x版本测试通过,低版本部分内部API路径可能存在差异
使用时如果需要获取纯年月数据,直接调用YearMonth.from(jfxDatePicker.getValue())即可忽略自动填充的1号日期,拿到需要的年月信息。
内容的提问来源于stack exchange,提问作者Sithum Dilshan
相关产品推荐
相关产品推荐

