【问题标题】:expand TreeView (parent)nodes which contains selected item展开包含所选项目的 TreeView(父)节点
【发布时间】:2014-01-02 10:16:06
【问题描述】:

我有一个存在于用户对象之外的 TreeView。 TreeView 表示用户的层次结构:

  • 大师1
    • 超级1
    • 超级2
      • 用户1
      • 用户2
    • 超级3
      • 用户3
    • 超级4
  • Master2
  • ...

当 TreeView 初始化时,每个 TreeItem 都会被折叠。但是,在加载 FXML 时,可能会从另一个 FXML 文件传递​​一个 TreeItem 对象。 eg: User3 已通过:

selectedUserTreeItem = (TreeItem<User>) currentNavigation.getPassthroughObject(); //this is the User3 TreeItem

我尝试使用递归函数从selecterUserTreeItem展开所有父节点

if (selectedUserTreeItem != null) {
    expandTreeView(selectedUserTreeItem);
}

tvUsers.setRoot(rootItem);

这是我目前所拥有的:

private void expandTreeView(TreeItem<User> selectedItem) {        
    if (selectedItem != null) {
        System.out.println(selectedItem);
        if (selectedItem.isLeaf() == false) {
            selectedItem.setExpanded(true);
        }
        TreeItem<User> parent = selectedItem.getParent();
        expandTreeView(parent);
    } else {
        System.out.println("null");
    }
}

我认为这与该函数是一个 void 函数这一事实有关,我想它应该返回一个 TreeItem 对象,但由于某种原因我没有成功。

有人能指出我正确的方向吗?

【问题讨论】:

    标签: recursion treeview javafx-2 javafx-8


    【解决方案1】:

    好的,我注意到在您的 expandTreeView() 方法中您展开节点,然后您递归到前一个节点以展开它。在我自己的代码中,我从根扩展到叶,所以让我们尝试一下:

    private void expandTreeView( TreeItem<User> selectedItem ) 
    {
        if ( selectedItem != null ) 
        {
            expandTreeView( selectedItem.getParent() );
    
            if ( ! selectedItem.isLeaf() ) 
            {
                selectedItem.setExpanded( true );
            }
        }
    }
    

    【讨论】:

    • 嗨,Jurgen,结果是一样的,但我结合上述方法找到了解决方案! selectedItem 不是来自新启动的 TreeView 的 TreeItem,因为它是从另一个 FXML 文件传递​​过来的。我必须遍历启动的 TreeView 以将 TreeItem 从循环链接到 selectedItem。一旦完成,该方法就可以作为一种魅力。非常感谢您的宝贵时间和圣诞快乐!
    【解决方案2】:

    不,我不认为这是因为您的方法返回 void。 尝试在展开之前先设置 TreeView 根:

    >>> tvUsers.setRoot(rootItem);
    
    if (selectedUserTreeItem != null) {
        expandTreeView(selectedUserTreeItem);
    }
    

    如果这不起作用,请尝试包装您的初始 expandTreeView() 以便稍后运行:

    Platform.runlater( new Runnable()
    {
        public void run() { expandTreeView( selectedUserTreeItem ); }
    };
    

    【讨论】:

    • 您好尤尔根,感谢您的回复。我已经尝试过了,但似乎结果相同。它似乎通过节点循环正确,例如:User1 - Super2 (expanding) - Master1 (expanding)。我只是不明白:)
    • 好的,希望以上内容适用于您的情况。查看下一个建议。
    【解决方案3】:

    好的,我遇到了同样的问题,发现我不得不像这样延迟扩展:

        Platform.runlater( new Task<Void>()
        {
            @Override
            protected Void call() throws Exception
            {
                Thread.sleep( 250 );
                return null;
            }
    
            @Override
            protected void succeeded()
            {
                expandTreeView( selectedUserTreeItem );
            }
    
        } );
    

    您可能必须尝试更改延迟以使其在您的情况下起作用。

    【讨论】:

    • 嘿尤尔根,再次感谢!我已经在上面尝试了您的建议,它似乎具有相同的结果。由于某种原因,TreeItems 没有扩展......甚至尝试了 2500 毫秒
    • 您是否将 tvUsers.setRoot(rootItem) 移至调用 expandTreeView() 方法之前?
    • 嗨尤尔根,是的,我做到了。好像没有效果。
    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2013-11-10
    • 2020-08-28
    • 2012-07-03
    • 1970-01-01
    • 2011-08-02
    • 2016-11-18
    • 2012-03-10
    相关资源
    最近更新 更多