Я определил структуру css для бездетного случая:
.tree-cell:browser-folder-childless .tree-disclosure-node .arrow {
-fx-font-weight: bold;
-fx-shape: null;
-fx-background-color: null;
-fx-background-image: url("childless.png");
-fx-background-repeat: no-repeat;
}
.tree-cell:browser-folder-childless:expanded .tree-disclosure-node .arrow {
-fx-font-weight: bold;
-fx-shape: null;
-fx-background-color: null;
-fx-background-image: url("childless.png");
-fx-background-repeat: no-repeat;
}
Затем я расширил класс TreeItem:
public class BrowserTreeItem extends TreeItem<MyData> {
public BrowserTreeItem(MyData data) {
super(data);
}
@Override
public boolean isLeaf() {
return (getValue().getTypes().contains(NodeType.FOLDER) && getValue().getChildren().size() == 0) ? false : super.isLeaf();
}
}
Таким образом, TreeItem всегда возвращает false для isLeaf () в случае бездетной папки. Метод isLeaf () будет использоваться классом com.sun.javafx.scene.control.skin.TreeCellSkin.class, чтобы решить, следует ли удалить узел раскрытия. Восстановление узла может быть непростым делом, поэтому я предотвращаю удаление узла.
Это приводит к нормальному раскрытию узла, теперь мне нужно изменить изображение узла.
Было бы неплохо перезаписать также метод isExanded () класса TreeItem. Тогда мне понадобится только одна структура CSS (метод всегда будет возвращать false для бездетных папок). Но isExpanded () является окончательным. Таким образом, я не могу предотвратить переключатель не / расширенный пользователем, и мне нужно определить две структуры CSS.
Затем я создал TreeCellFactory, который генерирует мои собственные классы BrowserTreeCell. Он переключает состояние PseudoClass, которое мы используем в приведенном выше CSS, чтобы активировать некоторые новые изображения для узла раскрытия.
public class BrowserTreeCell extends TreeCell<MyData> {
private final PseudoClass childless = PseudoClass.getPseudoClass("browser-folder-childless");
@Override
protected void updateItem(MyData item, boolean empty) {
super.updateItem(item, empty);
if (!empty && item != null) {
setText(item.getName());
setGraphic(item.getThumbnail());
setTooltip(item.getTooltip());
} else {
setText("");
setGraphic(null);
setTooltip(null);
}
pseudoClassStateChanged(childless, !empty && item != null && item.getTypes().contains(NodeType.FOLDER) && item.getChildren().size() == 0);
}
}
В результате я получаю узел раскрытия с «childless.png» в обоих случаях (не / расширенный).
person
witchi
schedule
09.12.2015