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

5

我有一个TreeView,其中包含用户对象。TreeView代表了用户的层次结构:

  • Master1
    • Super1
    • Super2
      • User1
      • User2
    • Super3
      • User3
    • Super4
  • Master2
  • ...

当TreeView初始化时,每个TreeItem都是折叠的。但是,在加载FXML时,可能会从另一个FXML文件传递一个TreeItem对象。例如:已经传递了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个回答

7

好的,我注意到在您的 expandTreeView() 方法中,您先扩展节点,然后递归到上一个节点来扩展它。在我的代码中,我从根节点扩展到叶子节点,所以让我们尝试一下这种方式:

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

嗨Jurgen,结果是一样的,但我结合上面找到了解决方案!selectedItem不是新初始化的TreeView中的TreeItem,因为它是从另一个FXML文件传递过来的。我必须循环遍历初始化的TreeView以将循环中的TreeItem链接到selectedItem。完成后,该方法运行得非常好。非常感谢您的时间,圣诞快乐! - Perneel

0

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

>>> tvUsers.setRoot(rootItem);

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

如果那不起作用,那么尝试将您的初始expandTreeView()包装到稍后运行:
Platform.runlater( new Runnable()
{
    public void run() { expandTreeView( selectedUserTreeItem ); }
};

嗨Jurgen,谢谢您的回复。我已经尝试了一下,但似乎结果是相同的。它似乎会正确地循环遍历节点,例如:User1-Super2(展开)-Master1(展开)。我就是不明白 :) - Perneel
好的,希望以上内容能够在您的情况下起作用。请看下一个建议。 - Jurgen

0

好的,我遇到了同样的问题,并发现我需要稍微延迟一下扩展,像这样:

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

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

    } );

你可能需要尝试并调整延迟时间,以使其在你的情况下正常工作。


嘿,Jurgen,再次感谢!我尝试了你上面的建议,但好像结果一样。由于某种原因,TreeItems没有展开...甚至尝试了2500毫秒。 - Perneel
你把 tvUsers.setRoot(rootItem) 移到了 expandTreeView() 方法调用之前了吗? - Jurgen
嗨,Jurgen,是的,我试过了。似乎没有效果。 - Perneel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接