首页 文章

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

提问于
浏览
1

我根据Change expand and collapse image TreeView JavaFX 2.2为公开节点的两个状态定义了图像(折叠/展开)

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

可能吗?

2 回答

  • 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的每个treeitem创建新的imageview,并且需要该图像 .

  • 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”的披露节点 .

相关问题