3

我可以JFXDatePicker通过下面的代码更改 JFoenix 库中特定日期的 a 的颜色。

        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;");
                        }
                    }                    
                } 
            };
        }   
    };

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

悬停前:悬停
示例悬停前的外观

示例悬停后的外观

4

1 回答 1

2

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

createDayCells()您可以在 的方法中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);
        }
    }
});
于 2018-03-02T12:16:58.600 回答