JavaFX8:将图像显示为无子TreeViewItems的公开节点

时间:2015-12-04 13:14:43

标签: image javafx treeview javafx-8 disclosure

我根据Change expand and collapse image TreeView JavaFX 2.2

为披露节点的两种状态定义了图像(折叠/展开)

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

有可能吗?

2 个答案:

答案 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”的披露节点(没有/扩展)。