在TreeView中设置选定的TreeItem

时间:2014-11-14 11:45:16

标签: java javafx treeview

我有一个位于GridPane内的TreeView。某个功能要求用户选择TreeItem并单击屏幕上的按钮。完成与按钮关联的功能后,我希望焦点返回到先前在TreeView中选择的TreeItem。

在按钮操作结束时,我有:

TreeItem<String> selectedItem = [TreeItem that was last selected]

如何突出显示selectedItem突出显示的TreeView?

TreeView或TreeItem都没有我可以使用的setSelected方法。

3 个答案:

答案 0 :(得分:5)

我认为TreeView.getSelectionModel()是你的朋友。

它提供:

答案 1 :(得分:5)

选择项目:

TreeView treeView = ... ; // initialize this
TreeItem treeItem = ... ; // initialize this, too
MultipleSelectionModel msm = treeView.getSelectionModel();

// This line is the not-so-clearly documented magic.
int row = treeView.getRow( treeItem );

// Now the row can be selected.
msm.select( row );

即,从treeItem获取treeView,然后将传递到treeView'选择模型。

除此之外,可以改进TreeView API以委托单个树项:

treeView.select( treeItem );

不幸的是,没有这样的方法。

答案 2 :(得分:0)

只需将(...)扩展到由马拉穆特(Malamut)对所选答案的评论,并加以澄清:

实际上,您不必执行两项操作(查找行,然后选择行)。效果很好:

tableView.getSelectionModel().select( treeItem );

但是,使用此方法或任何其他以编程方式设置选择的方法,如果树项未显示 ,这将只会失败。 “显示”与 visible 不同:一个节点可以显示但不可见,例如使用ScrollPane,其中所涉及的树的一部分已被滚动出视图。

“显示”是指所讨论的TreeItem的所有祖先,直到并包括根TreeItem。目前似乎没有内置方法可以完成此操作(JavaFX 11)。因此,在尝试进行程序选择之前,通常需要执行以下操作:

for( TreeItem ti = treeItemToBeSelected; ti.getParent() != null; ti = ti.getParent() ){
    ti.getParent().setExpanded( true );
}