我已經閱讀這裏和其他地方,應該使用CellFactory
,但我似乎無法理解如何。我不是在setGraphic之後,我只是想用css根據不同的節點類型定義不同的顏色。JavaFX:如何爲不同的TreeItem分配不同的顏色?
有什麼建議嗎?
我已經閱讀這裏和其他地方,應該使用CellFactory
,但我似乎無法理解如何。我不是在setGraphic之後,我只是想用css根據不同的節點類型定義不同的顏色。JavaFX:如何爲不同的TreeItem分配不同的顏色?
有什麼建議嗎?
// 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
之間沒有空格。)
我知道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類用來反映某個靜態屬性。但最終,這是一個有趣的問題。
你怎麼在java 7中做到這一點? – user3111525 2014-09-09 09:28:16
已更新爲顯示。只要把lambda變成一個匿名的內部類。 – 2014-09-09 14:41:09
在JavaFX 2中,它們還不存在,但在JavaFX 8中,如果樣式反映項目的不同狀態(而不是其他類型),則也可以使用PseudoClasses。 – glglgl 2017-06-12 15:26:27