如何将TableCell样式类绑定到TableRow样式类(JavaFX)

时间:2018-02-15 19:00:28

标签: java css user-interface javafx tableview

我正在为我的JavaFX应用程序创建一个系统日志窗口。我认为显示日志的最简单方法是能够对过滤器进行排序等是使用TableView。

日志消息有四种按枚举(LogType)分类的类型:

成功,信息,警告,错误。

如果类型是ERROR,我想使用CSS类.redText

将整个TableRow的文本更改为红色

我使用RowFactory做到了这一点。这是声明变量:

@FXML
TableView<LogMessage> table;
@FXML
TableColumn<LogMessage, String> timeColumn;
@FXML
TableColumn<LogMessage, LogMessage.LogType> typeColumn;
@FXML
TableColumn<LogMessage, String> msgColumn;

这是setRowFactory()。它位于我的控制器类的initialize()方法中。

        //Change text color based on success/failure
        table.setRowFactory(new Callback<TableView<LogMessage>, TableRow<LogMessage>>() {

            @Override
            public TableRow<LogMessage> call(TableView<LogMessage> param) {
                TableRow<LogMessage> tableRow = new TableRow<LogMessage>() {

                    @Override
                    protected void updateItem(LogMessage item, boolean empty) {
                        super.updateItem(item, empty);
                        this.getStyleClass().remove("redText");
                        if (item != null && !empty) {
                            if(item.isError()) {
                                this.getStyleClass().add("redText");
                            }
                        }
                    }

                };

                return tableRow;
            }
        });

这是有效的,除了我遇到的问题,其中一些日志消息对于我的固定大小的表太长,因此用户必须水平滚动。

我宁愿把它换成多行。所以我在msgColumn上添加了一个自定义单元工厂,使用我在StackOverflow上找到的一些代码,如下所示:

//Auto wrap the message column
        msgColumn.setCellFactory(tc -> {
            TableCell<LogMessage, String> cell = new TableCell<>();
            Text text = new Text();
            cell.setGraphic(text);
            cell.setPrefHeight(Control.USE_COMPUTED_SIZE);
            text.wrappingWidthProperty().bind(msgColumn.widthProperty());
            text.textProperty().bind(cell.itemProperty());
            text.styleProperty().bind(cell.styleProperty());
            return cell ;
        });

我添加了text.styleProperty().bind(cell.styleProperty());试图让它复制风格,但没有运气。

我认为消息列的cellFactory会覆盖TableRow上的样式。自动换行效果很好,但msg列的默认颜色为黑色,而该行的其余列的默认颜色为红色。

我怎样才能做到这两点,自动换行并保持风格?

我愿意通过CSS或Java控制器来完成它。

1 个答案:

答案 0 :(得分:1)

将(固定)样式类添加到Text

    msgColumn.setCellFactory(tc -> {
        TableCell<LogMessage, String> cell = new TableCell<>();
        Text text = new Text();
        cell.setGraphic(text);
        cell.setPrefHeight(Control.USE_COMPUTED_SIZE);
        text.wrappingWidthProperty().bind(msgColumn.widthProperty());
        text.textProperty().bind(cell.itemProperty());
        text.getStyleClass().add("table-cell-text");
        return cell ;
    });

然后在CSS中你可以做,例如,

.redText .table-cell .table-cell-text {
    -fx-fill: red ;
}

请注意,Text对象的CSS属性为-fx-fill。如果您使用Label(或者只是想直接设置表格单元格的文本颜色),则可以使用-fx-text-fill