JavaFX:使用css为单个TreeItem着色

时间:2016-07-29 08:15:26

标签: css javafx treeview

我希望能够根据某些条件为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()方法为所有节点返回的赋值字符串应为蓝色。

我该怎么办?

感谢。

1 个答案:

答案 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"); } } } }); 属性。