我已经根据更改展开和折叠图像 TreeView JavaFX 2.2为公开节点的两种状态(折叠/展开)定义了图像
但我想为文件夹节点提供第三张图像,它仍然没有任何子节点。不应展开/折叠此类节点,但它也应显示图像(即,一个 minus.png 用于展开节点,一个 plus.png 用于折叠节点,一个空矩形用于没有任何子节点的文件夹节点)。
可能吗?
我已经根据更改展开和折叠图像 TreeView JavaFX 2.2为公开节点的两种状态(折叠/展开)定义了图像
但我想为文件夹节点提供第三张图像,它仍然没有任何子节点。不应展开/折叠此类节点,但它也应显示图像(即,一个 minus.png 用于展开节点,一个 plus.png 用于折叠节点,一个空矩形用于没有任何子节点的文件夹节点)。
可能吗?
我为无子案例定义了一个 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() 是最终的。所以我不能阻止用户的非/扩展开关,我必须定义两个 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”的公开节点。
没有子节点意味着树项是“文件夹”类型的叶节点。您可以利用树项的图形属性来显示“空矩形”图像:
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 并且需要该图像的每个树项创建新的图像视图。