我有此tableview数据:
我要按照以下规则更改最后一列单元格的文本颜色:
我该怎么办?对于选择,我使用:
tableview.getSelectionModel().setCellSelectionEnabled(false);
tableview.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
我尝试过:
lastCol.setCellFactory(col -> new TableCell<Work, StateEnum> () {
@Override
protected void updateItem (StateEnum item, boolean empty) {
super.updateItem(item, empty);
Paint textColor = null;
if (this.isSelected()) // doesn't work, always is false
textColor = getDefaultSelectionTextColor(); // how can I get this?
else {
if ((item.equals(StateEnum.PENDING) ||
(item.equals(StateEnum.WORKING))
textColor = getDefaultTextColor(); // how can I get this?
else if (item.equals(StateEnum.CANCELLED))
textColor = Color.RED;
else
textColor = Color.GREEN;
}
setTextFill(textColor);
}
}
但是,我不知道如何获取默认文本颜色以及如何选择单元格行。也许updateItem不是最合适的方法?我可以在CSS中使用样式吗?我已经阅读了有关伪类的信息,但我不知道如何将其用于此问题。
答案 0 :(得分:1)
您可以并且应该使用CSS设置文本样式。如果某些选择器与单元格匹配,则PseudoClass
是最简单的更改方式:
*final PseudoClass cancelled = PseudoClass.getPseudoClass("cancelled");
final PseudoClass done = PseudoClass.getPseudoClass("done");
lastCol.setCellFactory(col -> new TableCell<Work, StateEnum> () {
@Override
protected void updateItem (StateEnum item, boolean empty) {
super.updateItem(item, empty);
pseudoClassStateChanged(done, false);
pseudoClassStateChanged(cancelled, false);
if (empty || item == null) {
setText("");
} else {
setText(item.toString());
switch (item) {
case CANCELLED:
pseudoClassStateChanged(cancelled, true);
break;
case DONE:
pseudoClassStateChanged(done, true);
break;
}
}
}
}
/* keep old style when selected */
.table-row-cell:selected .table-cell:cancelled,
.table-cell:selected:cancelled,
.table-row-cell:selected .table-cell:done,
.table-cell:selected:done {
-fx-text-fill: -fx-text-background-color;
}
/* adjustment of color for unselected cases */
.table-cell:cancelled {
-fx-text-fill: red;
}
.table-cell:done {
-fx-text-fill: green;
}