我正在为我的JavaFX应用程序创建一个系统日志窗口。我认为显示日志的最简单方法是能够对过滤器进行排序等是使用TableView。
日志消息有四种按枚举(LogType)分类的类型:
成功,信息,警告,错误。
如果类型是ERROR,我想使用CSS类.redText
我使用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控制器来完成它。
答案 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
。