如何在Vaadin DatePicker的弹出窗口中仅显示年、月而不显示日?是否支持该功能?
实现Vaadin DatePicker仅展示年月选择
当然可以实现这个需求!根据你使用的Vaadin版本,有两种实用方案可选:
方案1:改造原生DatePicker(适用于Vaadin 14-23)
如果你的项目基于较早的Vaadin版本,没有专门的年月选择组件,可以通过配置DatePicker的展示规则和国际化设置来隐藏日期选项:
设置输入框的展示格式
先指定DatePicker的显示格式,让输入框只呈现年月:DatePicker datePicker = new DatePicker(); // 可根据需求调整格式,比如"MM/yyyy"或"yyyy年MM月" datePicker.setPresentationFormat("yyyy-MM");自定义弹出窗口的国际化配置,隐藏日期面板
通过设置DatePicker的I18n对象,移除日期选择相关的元素,只保留年月切换功能:DatePicker.DatePickerI18n i18n = new DatePicker.DatePickerI18n(); // 清空日历相关的按钮文本,隐藏不必要的元素 i18n.setCalendar(""); i18n.setToday(""); i18n.setCancel(""); // 可按需自定义年月的显示文本 i18n.setMonthNames(new String[]{"1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"}); i18n.setWeekdaysShort(new String[]{"日", "一", "二", "三", "四", "五", "六"}); datePicker.setI18n(i18n);限制可选值(可选)
为了避免用户通过键盘输入具体日期,可添加值变更监听,强制选中当月第一天:datePicker.addValueChangeListener(event -> { if (event.getValue() != null) { LocalDate date = event.getValue(); datePicker.setValue(date.withDayOfMonth(1)); } });补充CSS隐藏日期表格(可选)
如果仍有日期选择面板残留,可通过CSS彻底隐藏:vaadin-date-picker-overlay::part(calendar) { display: none; }
方案2:使用官方MonthPicker组件(Vaadin 24+推荐)
从Vaadin 24开始,官方推出了MonthPicker组件,专门用于年月选择,默认就只展示年月选项,无需额外改造:
MonthPicker monthPicker = new MonthPicker(); // 设置展示格式 monthPicker.setPresentationFormat("yyyy-MM"); // 直接获取选中的年月(返回YearMonth类型) monthPicker.addValueChangeListener(event -> { YearMonth selectedMonth = event.getValue(); System.out.println("选中的年月:" + selectedMonth); });
这个组件的弹出窗口原生就只有年月切换器,完全匹配你的需求,是最省心的方案。
内容的提问来源于stack exchange,提问作者Александр Хворостенко
相关产品推荐
相关产品推荐

