TableView中的自定义文本单元格颜色

时间:2018-08-21 09:55:19

标签: javafx-8

我有此tableview数据:

enter image description here

我要按照以下规则更改最后一列单元格的文本颜色:

  • 如果选择了行->默认选择颜色
  • 如果文本为PENDING或WORKING并且未选择行->默认文本颜色
  • 如果文本已取消并且未选择行->红色
  • 如果文本是“完成”而不是未选中的行->绿色

我该怎么办?对于选择,我使用:

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中使用样式吗?我已经阅读了有关伪类的信息,但我不知道如何将其用于此问题。

1 个答案:

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

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