我有一个TreeView存在于User对象之外。 TreeView表示用户的层次结构:
初始化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对象,我猜想但由于某些原因我没有成功。
有人能指出我正确的方向吗?
答案 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 );
}
} );
您可能必须尝试改变延迟以使其适用于您的情况。