表格视图中的自定义文本单元格颜色

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;
}