JavaFX-如何在单击“日历”图标时更改DatePicker的默认日期?

时间:2019-03-11 16:20:39

标签: javafx

我正在使用 JFXDatePicker 扩展 DatePicker ,并想在单击“日历图标”时更改默认日期。

  • 默认为当前日期,我想将其更改为特定日期 通过代码(在195x中选择日期以节省时间 例。我禁用了可编辑功能,因此无法在文本字段中输入内容) 不想使用.setvalue(),因为它将在 该表格被称为。
  • 我已经使用了这段代码,但是没有用。

    birthday = new JFXDatePicker(LocalDate.of(1980, Month.MARCH, 11));

[http://i228.photobucket.com/albums/ee83/ThamVanTam/JFXDatePicker_zpscdgns2b6.png]

3 个答案:

答案 0 :(得分:3)

您可以通过聆听选择器 showingProperty 然后使用 Platform.runLater() 清除编辑器来简化 @KirantosTera 的代码

JFXDatePicker jfxDatePicker = new JFXDatePicker();
jfxDatePicker.showingProperty().addListener((observableValue, wasFocused, isNowFocus) -> {
    if (isNowFocus && jfxDatePicker.getValue() == null) {
        jfxDatePicker.setValue(LocalDate.now().minusYears(18));
        Platform.runLater(()->{
            jfxDatePicker.getEditor().clear();
        });
    }
});

答案 1 :(得分:1)

不幸的是,在弹出内容中没有可导航的公共 API。这由具有方法 goToDate(LocalDate, boolean) 的内部类 DatePickerContent 支持。如果您被允许(并且足够大胆:) 使用内部结构,您可以在 onShown 处理程序中这样做(以确保皮肤的 onShowing 侦听器不会干扰):

datePicker.setOnShown(e -> {
    if (datePicker.getValue() == null && datePicker.getSkin() instanceof DatePickerSkin) {
        DatePickerSkin skin = (DatePickerSkin) datePicker.getSkin();
        DatePickerContent popupContent = (DatePickerContent) skin.getPopupContent();
        popupContent.goToDate(LocalDate.now().minusYears(18), true);
    }
});

请注意,这需要打开 com.sun.javafx.scene.control.DatePickerContent

答案 2 :(得分:0)

这是我的解决方案,虽然不完美,但仍然可以解决我的问题:

        //Setting datepicker :
        birthday.setDayCellFactory(picker -> new DateCell() {
            @Override
            public void updateItem(LocalDate date, boolean empty) {
                super.updateItem(date, empty);
                //Setting date 18 years ago
                LocalDate today = LocalDate.ofYearDay(LocalDate.now().getYear() - 18, LocalDate.now().getDayOfYear());
                //Disable future date
                setDisable(empty || date.compareTo(today) > 0);
            }
        });
        //Setting actual value
        birthday.setValue(LocalDate.ofYearDay(LocalDate.now().getYear() - 18, LocalDate.now().getDayOfYear()));
        //Cover the value by text
        String pattern = "dd-MM-yyyy";
        formatCalender.format(pattern, birthday);
        birthday.getEditor().setText("Date Of Birth");
        birthday.setPromptText(null);