我希望能够根据某些条件为treeView的单个Tree Item着色。 这个答案似乎很好,但我无法实现它。 https://stackoverflow.com/a/10931896/6653207
我无法理解如何使用setCellFactory
方法格式化单个TreeItem
。
我有一个班级
public class Bag {
public String caption,assignment="";
Boolean eval;
public Set<Vertex> Nodes = new HashSet<Vertex>();
public Vector<Bag> ChildBags = new Vector<Bag>();
@Override
public String toString()
{
return assignment+ " " +caption;
}
}
这是我的css文件:
.true{
-fx-text-fill:#33cc00 ;
}
.assignment{
-fx-text-fill: #0033cc
}
所以我想要将eval属性为true的所有节点的标题颜色设置为绿色(toString()
方法返回)。
toString()
方法为所有节点返回的赋值字符串应为蓝色。
我该怎么办?
感谢。
答案 0 :(得分:2)
通过覆盖updateItem
的{{1}}方法,您可以根据单元格包含的TreeCell
值调整TreeCell
的属性。
在以下示例中,将为包含前缀为TreeItem
的值的所有单元格分配伪类,并且所有空单元格都为黑色背景。
"child"
CSS样式表
TreeView<String> treeView = ...
PseudoClass childPseudoClass = PseudoClass.getPseudoClass("child");
treeView.setCellFactory(tv -> new TreeCell<String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
// update for empty cell / cell containing null
pseudoClassStateChanged(childPseudoClass, false);
setText("");
setStyle("-fx-background-color: black;");
} else {
// update for filled cell
pseudoClassStateChanged(childPseudoClass, item.startsWith("child"));
setText(item);
setStyle(null);
}
}
});
每次值更改时.tree-cell:child {
-fx-background-color: red;
}
都会调用updateItem
方法,例如如果新的TreeView
与单元格相关联,或TreeItem
的{{1}}属性被修改。
您可以使用工厂向value
添加听众,在您退回之前,如果您愿意,也可以想要根据treeItem
property更改单元格。
编辑:要对文字应用不同的颜色,您需要为文本部分使用不同的TreeItem
。
TreeCell
要为文本着色,您需要使用Node
属性而不是treeView.setCellFactory(tv -> new TreeCell<Bag>() {
private final Text assignment;
private final Text caption;
private final Node graphic;
{
assignment = new Text();
caption = new Text();
assignment.getStyleClass().add("assignment");
graphic = new HBox(4, assignment, caption);
setGraphic(graphic);
}
@Override
protected void updateItem(Bag item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setGraphic(null);
} else {
setGraphic(graphic);
assignment.setText(item.assignment);
caption.setText(item.caption);
caption.getStyleClass().remove("true");
if (item.eval) {
caption.getStyleClass().add("true");
}
}
}
});
属性。