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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:24:03