我根据Change expand and collapse image TreeView JavaFX 2.2
为披露节点的两种状态定义了图像(折叠/展开)但我想为文件夹节点提供第三个图像,它仍然没有任何子节点。它不应该扩展/折叠这样的节点,但它也应该显示一个图像(即扩展节点的minus.png,折叠节点的plus.png和没有子节点的文件夹节点的空矩形)。
有可能吗?
答案 0 :(得分:0)
没有子节点意味着树项是叶节点,类型为“文件夹”。您可以利用树项的图形属性来显示“空矩形”图像:
ImageView ivfolder = new ImageView( "path/to/empty_rectangle.png" );
// You may use bindings
treeitem.graphicProperty().bind( Bindings
.when( treeitem.leafProperty() )
.then( ivfolder )
.otherwise( ( ImageView ) null )
);
// or set explicitly for that tree item
TreeItem<Folder> item = new TreeItem<>( "<empty>", ivfolder );
不要忘记为添加到treeView的每个树项目创建新的图像视图,并且需要该图像。
答案 1 :(得分:0)
我为无子女案例定义了一个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();
}
}
因此,对于无子文件夹,对于isLeaf(),TreeItem总是返回false。 com.sun.javafx.scene.control.skin.TreeCellSkin.class将使用isLeaf()方法来决定是否应删除公开节点。重建节点可能很棘手,因此我阻止删除节点。
这导致正常的公开节点,现在我必须更改节点的图像。
覆盖TreeItem类的isExanded()方法会很不错。然后我只需要一个CSS结构(该方法对于无子文件夹总是返回false)。但isExpanded()是最终的。所以我不能阻止用户使用not / expanded切换,我必须定义两个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”的披露节点(没有/扩展)。