在TableCell中更改背景颜色会删除选择颜色,使其难以阅读

时间:2019-04-08 20:33:45

标签: java css javafx

我进行了更改:

Change TableColumn background in TableView, whilst retaining alternating row colour?

未选中看起来不错:

unselected

但是,当您选择一个单元格时:

selected

看起来像这样,但是我希望它在被选中/集中时能够正常工作。

我很确定我需要使用样式类,但是,我不知道仅使用不同的颜色背景来保留TableCell的所有其他功能所需要的属性是什么。另外,我是否在单元级别或列级别应用样式类?

更新

我的CSS文件: custom.css

.customhighlight .table-cell {
    -fx-background-color: rgba(0, 128, 0, 0.3);
}

.customhighlight .table-cell:selected {
    -fx-background-color: inherit;
}

如何将其应用于一列?

我尝试了

table.getStyleClass().add("customhighlight");

但是,它改变了整个表。

我尝试了

tableCol.getStyleClass().add("customhighlight");

它什么也没做。

我也在单元格级别上尝试过...

3 个答案:

答案 0 :(得分:2)

如果我对您的理解正确,那么您想要:

  • 一列中所有具有半透明背景的单元格。
  • 这些单元格在被选中时应看起来像默认的modena.css所选外观。
    • 换句话说,用深蓝色替换半透明的背景,文本变成白色。

您应该将样式类添加到可以在CSS文件中使用的适当单元格中。这是一个小例子:

Main.java

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.util.Pair;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        var table = System.getProperties().stringPropertyNames().stream()
                .map(name -> new Pair<>(name, System.getProperty(name)))
                .collect(collectingAndThen(toCollection(FXCollections::observableArrayList), TableView::new));
        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
        table.getSelectionModel().setCellSelectionEnabled(true); // Not sure if you're using cell or row selection

        var keyCol = new TableColumn<Pair<String, String>, String>("Key");
        keyCol.setCellValueFactory(new PropertyValueFactory<>("key"));
        table.getColumns().add(keyCol);

        var valCol = new TableColumn<Pair<String, String>, String>("Value");
        valCol.setCellValueFactory(new PropertyValueFactory<>("value"));
        valCol.setCellFactory(tc -> new TableCell<>() {
            { getStyleClass().add("highlighted-table-cell"); }
            @Override protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (empty || item == null) {
                    setText(null);
                } else {
                    setText(item);
                }
            }
        });
        table.getColumns().add(valCol);

        var scene = new Scene(table, 600, 400);
        scene.getStylesheets().add("Main.css");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}

Main.css

.highlighted-table-cell {
    -fx-background-color: rgba(0, 128, 0, 0.3);
}

/* Needed by cell selection mode */
.highlighted-table-cell:selected {
    -fx-background-color: inherit;
}

/* Needed by row selection mode */
.table-row-cell:selected > .highlighted-table-cell {
    -fx-background-color: inherit;
}

答案 1 :(得分:1)

类似

table.getSelectionModel().setCellSelectionEnabled(true);

.table-cell:selected {
    -fx-background-color: white;
    -fx-text-fill: black;
}

应该工作

答案 2 :(得分:1)

您可以通过订阅选定的属性,在updateItem()的{​​{1}}方法中切换样式:

TableCell

或通过使用CSS文件:

String style = "-fx-background-color: rgba(0, 128, 0, 0.3);";
setStyle(style);
selectedProperty().addListener((observableValue, value, old) -> {
    if (value) {
        setStyle(style);
    } else {
        setStyle(null);
    }
});

这将为表格中的所有单元格着色。如果您只想为单个列着色,我建议为此使用自定义类:

.table-cell {
    -fx-background-color: rgba(0, 128, 0, 0.3);
}

.table-cell:selected {
    -fx-background-color: inherit;
}

以这种方式修改CSS文件:

getStyleClass().add("customhighlight");

所有解决方案都通过重置背景色来为所选单元格使用默认选择样式。结果看起来像这样:

result