展开包含所选项的TreeView(父)节点

时间:2013-12-14 18:51:22

标签: recursion treeview javafx-2 javafx-8

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

  • Master1
    • Super1
    • SUPER2
      • 用户1
      • 用户2
    • Super3
      • 用户3
    • Super4
  • Master2
  • ...

初始化TreeView时,每个TreeItem都会折叠。但是,可能是在加载FXML时,TreeItem对象从另一个FXML文件传递。例如: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对象,我猜想但由于某些原因我没有成功。

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

3 个答案:

答案 0 :(得分:4)

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

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

        if ( ! selectedItem.isLeaf() ) 
        {
            selectedItem.setExpanded( true );
        }
    }
}

答案 1 :(得分:0)

不,我不认为它,因为你的方法返回无效。 在扩展之前尝试先设置TreeView根目录:

>>> tvUsers.setRoot(rootItem);

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

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

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

答案 2 :(得分:0)

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

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

        @Override
        protected void succeeded()
        {
            expandTreeView( selectedUserTreeItem );
        }

    } );

您可能必须尝试改变延迟以使其适用于您的情况。