当前位置:  开发笔记 > 编程语言 > 正文

JavaFX从DatePicker中提取日历弹出窗口/仅显示弹出窗口

如何解决《JavaFX从DatePicker中提取日历弹出窗口/仅显示弹出窗口》经验,为你挑选了1个好方法。

我正在尝试为JavaFX应用程序构建CalendarView,仅显示日期(不需要选择).由于DatePicker该类有一个很好的日历弹出窗口,我想我可能会尝试提取它,以便我已经涵盖了所有的样式问题.

那么是否有一种简单的方法来提取DatePicker日历弹出窗口并将其插入到新的CalendarView中?

我已经show()ComboBoxBase课堂上看过这个方法,看看当弹出窗口被触发时到底发生了什么,但我不得不承认我无法理解它.

或者,我可以考虑简单地编辑DatePicker,只有弹出窗口始终显示编辑器 - TextField和按钮组件始终隐藏,但我再也无法弄清楚如何在不隐藏弹出窗口的情况下执行此操作.另外,我可能需要让弹出窗口的边界适当地管理这个替代方案中的高度和宽度,这似乎并不那么容易.



1> Modus Tollen..:

您可以从DatePickerSkin获取DatePicker的弹出内容.有关实现,请参阅此演示:

public class DatePickerPopupDemo extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root, 400, 400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());

            DatePickerSkin datePickerSkin = new DatePickerSkin(new DatePicker(LocalDate.now()));
            Node popupContent = datePickerSkin.getPopupContent();

            root.setCenter(popupContent);

            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

弹出内容


如果不需要顶栏,您可以查找并隐藏它.

DatePickerSkin datePickerSkin = new DatePickerSkin(new DatePicker(LocalDate.now()));
Node popupContent = datePickerSkin.getPopupContent();

// force a css layout pass to ensure that lookup calls work
popupContent.applyCss();
popupContent.lookup(".month-year-pane").setVisible(false);

root.setCenter(popupContent);

隐藏顶栏的弹出内容

更新:

从JDK 9开始,它DatePickerSkin是Public API的一部分,com.sun.[...]不再需要使用封闭式实现.(见JavaDoc)

此外,如评论中所述,要获取所选值,您必须访问DatePicker从中提取皮肤的内容(例如,将其保存为变量).

DatePicker datePicker = new DatePicker(LocalDate.now());
DatePickerSkin datePickerSkin = new DatePickerSkin(datePicker);
Node popupContent = datePickerSkin.getPopupContent();
//[...]
LocalDate selectedDate = datePicker.getValue();

您还可以通过向ChangeListener关联的属性添加a 来监听值更改:

datePicker.valueProperty().addListener(new ChangeListener() {
    @Override
    public void changed(ObservableValue observable, LocalDate oldValue, LocalDate newValue) {
        System.out.println("New Value: " + newValue);
    }
});
//Or using neat lambda
datePicker.valueProperty().addListener((observable, oldValue, newValue) -> {
    System.out.println("New Value: " + newValue);
});

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有