TableView setRowFactory CSS选择器

时间:2018-02-09 14:12:21

标签: java css javafx javafx-8

我想在TableView中呈现完整的行,具体取决于此行中的项目。我使用TableView.setRowFactory,但似乎这不起作用。

正如您在代码中看到的那样,如果此行中人员的姓氏为" Smith",则应使用不同的文本颜色呈现该行。

如果我使用TableColumn.setCellFactory,相同的代码正在工作。但我不想在所有不同的单元工厂中复制必要的代码。

我的错误在哪里?

public class TableViewTest extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        final Scene scene = new Scene(createContents());
        scene.getStylesheets().add(getClass().getResource("test.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Pane createContents() {
        final ObservableList<Person> items = FXCollections.observableArrayList(
                new Person("John", "Smith"), new Person("Mary", "Smith"),
                new Person("William", "Young"));
        final TableView<Person> table = new TableView<>(items);
        final TableColumn<Person, String> c1 = new TableColumn<>("First name");
        c1.setCellValueFactory(p -> new SimpleStringProperty(p.getValue().getFName()));
        final TableColumn<Person, String> c2 = new TableColumn<>("Last name");
        c2.setCellValueFactory(p -> new SimpleStringProperty(p.getValue().getLName()));
        table.getColumns().setAll(c1, c2);
        table.setRowFactory(param -> new TableRow<Person>() {
            protected void updateItem(Person item, boolean empty) {
                super.updateItem(item, empty);
                getStyleClass().remove("own-cell");
                if (item != null && item.getLName().equals("Smith")) {
                    getStyleClass().add("own-cell");
                }
            };
        });
        return new HBox(table);
    }
}

这是简单的样式表test.css,只有一种样式:

.table-row-cell:filled .own-cell {
    -fx-text-fill: cyan;
}

1 个答案:

答案 0 :(得分:1)

您的CSS不正确:选择器

.table-row-cell:filled .own-cell

选择样式类为own-cell的元素,该元素是样式类为table-row-cell的元素的后代(并且具有伪类filled)。

您需要选择任何table-cell作为元素的后代,同时使用样式类own-cell table-row-cell

以下将执行此操作:

.own-cell.table-row-cell:filled .table-cell {
    -fx-text-fill: cyan;
}

请注意.own-cell.table-row-cell之间没有空格。

顺便说一句,如果你有一个可以使用布尔表达式打开或关闭的CSS类,那么使用自定义PseudoClass通常比从列表中添加和删除样式类更容易。您可以考虑以下修改:

    PseudoClass ownCell = PseudoClass.getPseudoClass("own-cell");
    table.setRowFactory(param -> new TableRow<Person>() {
        protected void updateItem(Person item, boolean empty) {
            super.updateItem(item, empty);
            pseudoClassStateChanged(ownCell, item != null && item.getLName().equals("Smith"));
        };
    });

您使用CSS

.table-row-cell:filled:own-cell .table-cell {
    -fx-text-fill: cyan;
}