JavaFX JFXDatePicker为特定日期设置颜色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaFX JFXDatePicker为特定日期设置颜色相关的知识,希望对你有一定的参考价值。

我可以通过下面的代码在某些日期从JFoenix库中更改JFXDatePicker的颜色。

        final Callback<DatePicker, DateCell> dayCellFactory = new Callback<DatePicker, DateCell>() {
        @Override
        public DateCell call(final DatePicker datePicker) {
            return new DateCell() {
                @Override
                public void updateItem(LocalDate item, boolean empty) {
                    super.updateItem(item, empty);
                    if(!empty) {
                        if(listRegisteredTOTDays.contains(item)) {
                            setStyle("-fx-background-color: #99e699;");
                        }
                    }                    
                } 
            };
        }   
    };

当我在具有更改背景的项目上盘旋时,会出现问题。它在悬停后将背景颜色更改为默认颜色,而不是通过上面的代码设置的背景颜色。我不想禁用该单元格,因为用户仍然必须能够单击它!练习是告知用户哪些日期已有数据。所以什么都不能被禁用。怎么克服这个?我只是想在悬停后回到上面的颜色设置。

在悬停之前: Example how it looks before hovering 并在徘徊之后

Example how it looks after hovering

答案

虽然JFXDatePicker看起来很漂亮,但需要一些自由才能让DateCells难以定制。它不是使用CSS来设置单元格样式,而是从代码中设置背景,该代码具有比任何CSS更高的优先级,甚至是内联CSS样式。

你可以在createDayCells() method of com.jfoenix.skins.JFXDatePickerContent看到这个。

这意味着在不修改皮肤的情况下,解决这个问题的唯一机会就是添加自己的事件处理程序并使用Platform.runLater来确保它在createDayCells()中添加事件处理程序之后运行:

final Background markedBackground = new Background(new BackgroundFill(Color.rgb(0x99, 0xE6, 0x99),
        CornerRadii.EMPTY,
        Insets.EMPTY));

picker.setDayCellFactory(dp -> new DateCell() {

    {
        addEventHandler(MouseEvent.MOUSE_EXITED, evt -> {
            if (listRegisteredTOTDays.contains(getItem())) {
                // override background property of marked cells after
                // JFXDatePicker modifies it
                Platform.runLater(() -> {
                    setBackground(markedBackground);
                });
            }
        });
    }

    @Override
    public void updateItem(LocalDate item, boolean empty) {
        super.updateItem(item, empty);

        if (!empty && listRegisteredTOTDays.contains(item)) {
            setBackground(markedBackground);
        }
    }
});

以上是关于JavaFX JFXDatePicker为特定日期设置颜色的主要内容,如果未能解决你的问题,请参考以下文章

javafx datepicker如何自定义

Javafx:TableView根据行列获取特定表格单元格的图形节点

JavaFX 8 日期选择器功能

javaFx 是不是有可用的日期和时间选择器?

javafx GridPane 检索特定的单元格内容

JavaFX:setDisable(true)DatePicker问题