JavaFX8树表视图自定义根行

JavaFX8树表视图自定义根行,javafx,javafx-8,root-node,treetableview,Javafx,Javafx 8,Root Node,Treetableview,在我的树表视图中,我有一个根项,它包含子项(我错误地称它们为根项),而子项又有子项。我需要自定义那些被错误地称为根项目行的文本外观。是否有这样一个选择器,或者如何实现 谢谢。这将在包含根的行上设置一个伪类: final PseudoClass firstRowClass = PseudoClass.getPseudoClass("first-row"); treeTableView.setRowFactory(treeTable -> { TreeTableRow<...&

在我的树表视图中,我有一个根项,它包含子项(我错误地称它们为根项),而子项又有子项。我需要自定义那些被错误地称为根项目行的文本外观。是否有这样一个选择器,或者如何实现


谢谢。

这将在包含根的行上设置一个伪类:

final PseudoClass firstRowClass = PseudoClass.getPseudoClass("first-row");

treeTableView.setRowFactory(treeTable -> {
    TreeTableRow<...> row = new TreeTableRow<>();
    row.treeItemProperty().addListener((ov, oldTreeItem, newTreeItem) -> 
        row.pseudoClassStateChanged(firstRowClass, newTreeItem == treeTable.getRoot()));
    return row ;
});
完整示例

听起来像是要设置根节点的直接子节点的样式。在这种情况下,就这么做吧

    row.treeItemProperty().addListener((ov, oldTreeItem, newTreeItem) -> 
        row.pseudoClassStateChanged(firstRowClass, 
           newTreeItem != null && newTreeItem.getParent() == treeTable.getRoot()));
而不是上面代码中的条件。显然,您可以根据需要使用其他条件(例如,
!newtreitem.isLeaf()

请注意,
树表行
的默认样式表规则有点奇怪:
-fx background color
是为行设置的,但是
-fx text fill
是为行和其中的单元格设置的。所以如果你想改变背景颜色,你只需要

-tree-table-row-cell:first-row {
  -fx-background-color: antiquewhite ;
}
但如果要更改文本颜色,则需要在单元格上更改:

-tree-table-row-cell:first-row .tree-table-cell {
  -fx-text-fill: red ;
}

我试过了,而且成功了。如果您要更改文本填充,您可能需要在外部css中使用
.tree table row cell:first row.tree-table.cell{-fx text fill:red;}
(出于某种原因,文本填充在
树表row cell
modena.css
中的
树表cell
中指定)。仍然不走运..我不知道为什么,可能是因为我有一个全局不可见的根项目,其中包含几个可见的根项目吗?是的,但这是我在上面的评论中描述的情况。只有第一个全局根项目在redI中着色,我认为这就是你要找的。你说的是“根行”。TreeView或TreeTableView只有一个根。好的,我想我应该重新表述这个问题
-tree-table-row-cell:first-row .tree-table-cell {
  -fx-text-fill: red ;
}