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

Recursion 展开包含选定项的TreeView(父)节点,recursion,treeview,javafx-2,javafx-8,Recursion,Treeview,Javafx 2,Javafx 8,我有一个树状视图存在于用户对象之外。TreeView表示用户的层次结构: 大师1 超级1 超级2 用户1 用户2 超级3 用户3 超级4 大师2 初始化TreeView时,每个TreeItem都会折叠。但是,当加载FXML时,可能会从另一个FXML文件传递TreeItem对象。例如:User3已通过: selectedUserTreeItem = (TreeItem<User>) currentNavigation.getPassthroughObject(); /

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

  • 大师1
    • 超级1
    • 超级2
      • 用户1
      • 用户2
    • 超级3
      • 用户3
    • 超级4
  • 大师2
初始化TreeView时,每个TreeItem都会折叠。但是,当加载FXML时,可能会从另一个FXML文件传递TreeItem对象。例如:User3已通过:

selectedUserTreeItem = (TreeItem<User>) currentNavigation.getPassthroughObject(); //this is the User3 TreeItem
这就是我到目前为止所做的:

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");
    }
}
private void expandTreeView(TreeItem selectedItem){
如果(selectedItem!=null){
System.out.println(selectedItem);
如果(selectedItem.isLeaf()==false){
选择editem.setExpanded(true);
}
TreeItem parent=selectedItem.getParent();
expandTreeView(父级);
}否则{
System.out.println(“空”);
}
}
我认为这与函数是一个空函数这一事实有关,它应该返回一个TreeItem对象,我想,但由于某种原因,我没有成功地这样做


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

不,我不认为是因为你的方法返回了void。 在展开之前,请先尝试设置TreeView根目录:

>>> tvUsers.setRoot(rootItem);

if (selectedUserTreeItem != null) {
    expandTreeView(selectedUserTreeItem);
}
如果不起作用,请尝试包装初始expandTreeView(),以便稍后运行:

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

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

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

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

    } );
Platform.runlater(新任务()
{
@凌驾
受保护的Void调用()引发异常
{
睡眠(250);
返回null;
}
@凌驾
受保护的无效已成功()
{
expandTreeView(选择EdUserTreeItem);
}
} );

您可能需要尝试改变延迟以使其在您的情况下工作。

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

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

        if ( ! selectedItem.isLeaf() ) 
        {
            selectedItem.setExpanded( true );
        }
    }
}
private void expandTreeView(TreeItem selectedItem)
{
如果(selectedItem!=null)
{
expandTreeView(selectedItem.getParent());
如果(!selectedItem.isLeaf())
{
选择editem.setExpanded(true);
}
}
}

Hi Jurgen,感谢您的回复。我试过了,但似乎效果一样。它似乎在节点间正确循环,例如:
User1-Super2(扩展)-Master1(扩展)
。我就是不明白:)好吧,希望上面的方法能对你有用。看看下一个建议。嘿,尤根,再次感谢你!我已经试过你的建议了,似乎也有同样的效果。由于某种原因树没有扩展。。。甚至在调用expandTreeView()方法之前用2500msDid尝试过将tvUsers.setRoot(rootItem)移动到哪个位置?嗨,Jurgen,是的。似乎没有效果。嗨,Jurgen,这是相同的结果,但我找到了解决方案,结合上述!
selectedItem
不是新启动的TreeView中的TreeItem,因为它是从另一个FXML文件传递的。我必须在启动的TreeView中循环,以将TreeItem从循环链接到selectedItem。一旦这样做了,这个方法就像一个符咒。非常感谢您抽出时间,祝您圣诞快乐!
private void expandTreeView( TreeItem<User> selectedItem ) 
{
    if ( selectedItem != null ) 
    {
        expandTreeView( selectedItem.getParent() );

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