0

我有以下代码来设置 a 的背景颜色TableRow

column.setCellFactory((TableColumn<Model, Integer> p) -> {
           ComboBoxTableCell cell = new ComboBoxTableCell(FXCollections.observableArrayList(0, 1)) {
               @Override
               public void updateItem(Object item, boolean empty) {
                   super.updateItem(item, empty);
                   if (!empty && item != null) {
                       if(Integer.valueOf(item.toString()) == 1){
                           getTableRow().setStyle("-fx-background-color: khaki;");
                       }else if(Integer.valueOf(item.toString()) == 0){
                           getTableRow().setStyle(null);
                       }
                   }
               }
           };
           return cell;
        });

问题是当我选择背景设置为某种颜色的行时,默认的蓝色表示选择落后。(如下所示)

在此处输入图像描述

如何保留默认选择颜色?

4

1 回答 1

2

内联样式比 CSS 样式表具有更高的优先级。因此,所选行的背景也会被覆盖。背景的构造方式需要您使用指定-fx-control-inner-background-alt-fx-control-inner-background代替。

[...].setStyle("-fx-control-inner-background: khaki; -fx-control-inner-background-alt: khaki;")

但是有一个更糟糕的问题:

您从TableCells 设置样式。由于TableView负责将项目分配给单元格,因此如果您在不同列中使用单元格类型,则执行顺序是导致任意结果的实现细节。即使您只在一列中使用这些单元格,您也永远不会处理单元格变为空的情况,因此即使是空单元格仍可能包含新颜色。

行样式属于表格行。

如果您使用 aPseudoClass和 CSS 样式表,您还可以获得最大的灵活性。

例如

final PseudoClass one = PseudoClass.getPseudoClass("one");
tableView.setRowFactory(t -> new TableRow<Model>() {

    private ChangeListener<Integer> listener = (o, oldValue, newValue) -> {
        pseudoClassStateChanged(one, newValue == 1);
    };

    @Override
    protected void updateItem(Model model, boolean empty) {
        if (getItem() != null) {
            getItem().myValueProperty().removeListener(listener);
        }

        super(model, empty);

        if (empty || model == null) {
            listener.changed(null, 0, -1);
        } else {
            model.myValueProperty().addListener(listener);
            listener.changed(null, 0, model.getMyValue());
        }
    }


});

CSS 样式表

.table-row-cell:one {
    -fx-control-inner-background: khaki;
    -fx-control-inner-background-alt: khaki;
}

此外,您应该使用类型参数来避免从IntegertoString和 back to转换为您的项目Integer(如果需要以这种方式完成,则应将其替换为强制转换。在这种情况下,最好不要使用原始类型。)。

final ObservableList<Integer> values = FXCollections.observableArrayList(0, 1);

column.setCellFactory((TableColumn<Model, Integer> p) -> {
    ComboBoxTableCell<Model, Integer> cell = new ComboBoxTableCell<Model, Integer>(values) {
        @Override
        protected void updateItem(Integer item, boolean empty) {
            ...
        }
    };
    return cell;
});
于 2018-06-26T12:48:15.927 回答