JavaFX:如何为不同的TreeItem分配不同的颜色?

时间:2014-09-04 12:44:58

标签: javafx treeview

我已经在这里和其他地方读过,应该使用CellFactory,但我似乎无法理解如何。我不是在setGraphic之后,我只是想用css根据不同的类型为不同的节点定义不同的颜色。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

// Your style classes: obviously choose names that logically reflect your application
List<String> allTreeItemStyles = Arrays.asList("style1", "style2", "style3"); 

TreeView<MyTreeType> tree = new TreeView<>();
tree.setCellFactory(tv ->  new TreeCell<MyTreeType>() {
    @Override
    public void updateItem(MyTreeType item, boolean empty) {
        super.updateItem(item, empty);
        getStyleClass().removeAll(allTreeItemStyles);
        if (empty) {
            setText("");
        } else {
            setText(...); // appropriate text for item
            String styleClass = ... ; // choose style class for item
            getStyleClass().add(styleClass);
        }
    }
});

如果由于某种原因您仍然使用JavaFX 2.2,则需要将lambda表达式替换为匿名内部类:

tree.setCellFactory(new Callback<TreeView<MyTreeType>, TreeCell<MyTreeType>>() {
    @Override
    public TreeCell<MyTreeType> call(TreeView<MyTreeType> tv) {
        return new TreeCell<MyTreeType>() {
            @Override
            public void updateItem(MyTreeType item, boolean empty) {
                 // implementation as above...
            }
        }
    }
});

然后在外部样式表中,只需执行

.tree-cell.style1 {
   /* ... */
}

.tree-cell.style2 {
  /* ... */
}

/* etc */

(注意.tree-cell.style1之间没有空格。)

答案 1 :(得分:1)

我知道OP使用Java 7和JavaFX 2.2,但对于使用JavaFX 8的人来说,另一种优雅的方式是这样的:

PseudoClass PSEUDOCLASS1 = PseudoClass.getPseudoClass("pseudoclass1");
PseudoClass PSEUDOCLASS2 = PseudoClass.getPseudoClass("pseudoclass2");
PseudoClass PSEUDOCLASS3 = PseudoClass.getPseudoClass("pseudoclass3");

TreeView<MyTreeType> tree = new TreeView<>();
tree.setCellFactory(treeView -> new TreeCell<MyTreeType>() {
    @Override
    public void updateItem(MyTreeType item, boolean empty) {
        super.updateItem(item, empty);
        if (empty) {
            setText("");
            pseudoClassStateChanged(PSEUDOCLASS_1, false);
            pseudoClassStateChanged(PSEUDOCLASS_2, false);
            pseudoClassStateChanged(PSEUDOCLASS_3, false);
        } else {
            setText(item.getText());
            pseudoClassStateChanged(PSEUDOCLASS_1, item.isFoo());
            pseudoClassStateChanged(PSEUDOCLASS_2, item.isBar());
            pseudoClassStateChanged(PSEUDOCLASS_3, item.isBazinga());
        }
    }
});

在外部样式表中,您可以

.tree-cell:pseudoclass1 {
   /* the way you want the cell styled if pseudo class 1 is active */
}

.tree-cell:pseudoclass2 {
   /* the way you want the cell styled if pseudo class 2 is active */
}

.tree-cell:pseudoclass3 {
   /* the way you want the cell styled if pseudo class 3 is active */
}

CSS伪类用于反映某种状态,而CSS类用于反映某种静态属性。但最终,这只是一种品味问题。