表格视图中的自定义文本单元格颜色
Custom text cell color in 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 中的样式执行此操作吗?我读过有关伪类的内容,但我不知道如何使用它来解决这个问题。
您可以而且应该使用 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;
}
}
}
}
CSS 样式表
/* 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;
}
我有这个表视图数据:
我想按照以下规则更改最后一列单元格的文本颜色:
- 如果行被选中 -> 默认选择颜色
- 如果文本处于待定或工作状态并且未选择行 -> 默认文本颜色
- 如果文本被取消且未选择行 -> 红色
- 如果文本已完成且未选择行 -> 绿色
我怎样才能得到它?对于选择,我使用:
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 中的样式执行此操作吗?我读过有关伪类的内容,但我不知道如何使用它来解决这个问题。
您可以而且应该使用 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;
}
}
}
}
CSS 样式表
/* 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;
}