JavaFX JFXDatePicker 为特定日期设置颜色

JavaFX JFXDatePicker set color for specific dates

我可以通过以下代码在某些日期从 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;");
                        }
                    }                    
                } 
            };
        }   
    };

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

悬停前:

悬停后

虽然 JFXDatePicker 看起来很漂亮,但它需要一些自由,这使得 DateCell 很难定制。它不是使用 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);
        }
    }
});