1

我已经根据更改展开和折叠图像 TreeView JavaFX 2.2为公开节点的两种状态(折叠/展开)定义了图像

但我想为文件夹节点提供第三张图像,它仍然没有任何子节点。不应展开/折叠此类节点,但它也应显示图像(即,一个 minus.png 用于展开节点,一个 plus.png 用于折叠节点,一个空矩形用于没有任何子节点的文件夹节点)。

可能吗?

4

2 回答 2

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() 是最终的。所以我不能阻止用户的非/扩展开关,我必须定义两个 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”的公开节点。

于 2015-12-09T13:48:45.723 回答
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 并且需要该图像的每个树项创建新的图像视图。

于 2015-12-04T14:40:28.347 回答