JavaFX:如何在TreeView中找到TreeItem的索引?

JavaFX:如何在TreeView中找到TreeItem的索引?,java,javafx,treeview,Java,Javafx,Treeview,我的程序中有一个TreeView和一个按钮。无论何时单击此按钮,它都会在树视图中最后选择的元素之后添加一个新元素。 例如,如果我要选择“Test Action”元素并单击“Add”按钮,它应该在“Test Action”之后但在“Test Condition”之前添加另一个TreeItem 我编写了代码,以便跟踪最后选择的元素: @FXML TreeView<String> view; TreeItem<String> current = root; view.sele

我的程序中有一个
TreeView
和一个
按钮。无论何时单击此
按钮
,它都会在树视图中最后选择的元素之后添加一个新元素。

例如,如果我要选择“Test Action”元素并单击“Add”按钮,它应该在“Test Action”之后但在“Test Condition”之前添加另一个
TreeItem

我编写了代码,以便跟踪最后选择的元素:

@FXML
TreeView<String> view;
TreeItem<String> current = root;
view.selectionModelProperty().addListener(new ChangeListener<MultipleSelectionModel<TreeItem<String>>>() {

            @Override
            public void changed(ObservableValue<? extends MultipleSelectionModel<TreeItem<String>>> observable,
                    MultipleSelectionModel<TreeItem<String>> oldValue,
                    MultipleSelectionModel<TreeItem<String>> newValue) {
                    current = newValue.getSelectedItem();
            }
});
@FXML
树视图;
TreeItem电流=根;
view.selectionModelProperty().addListener(新的ChangeListener()){
@凌驾

更改公众假期(observeValue类
TreeItem
有一个方法,它返回指定的
TreeItem
的父级。这个父级也是
TreeItem
有一个方法来获取子
TreeItem
s;返回的
observebelist
中的
TreeItem
的顺序是您可以执行的实际顺序请参见屏幕上的,因此,在使用检索列表中元素的索引后,可以使用在特定索引中插入新元素

您只需在
按钮的事件侦听器中处理当前选择

Button b = new Button("Add");
b.setOnAction(event -> {
    // Get the selected item
    TreeItem<String> selectedItem = treeView.getSelectionModel().getSelectedItem();

    // If there is no selection or the root is selected do nothing
    if (selectedItem == null || selectedItem == rootNode)
        return;

    // Otherwise get the index of the Node from the children of its parent
    // and append the new item right after it
    int index = selectedItem.getParent().getChildren().indexOf(selectedItem);
    selectedItem.getParent().getChildren().add(index+1, new TreeItem<>("New Item"));
});

我认为这只适用于深度为1的树的这种特定情况。你知道一种有效的方法来处理任意树吗?它应该适用于任何级别。例如,如果你有一棵树有三个级别,如果你选择一个级别3的叶子,它将添加一个新的级别3叶子。如果你选择一个级别2的分支,它将添加一个新的级别2分支。它是什么oes not do:不会向level2分支添加新的level3叶,但它是一种不同的功能。
Button b = new Button("Add");
b.setOnAction(event -> {
    // Get the selected item
    TreeItem<String> selectedItem = treeView.getSelectionModel().getSelectedItem();

    // If there is no selection or the root is selected do nothing
    if (selectedItem == null || selectedItem == rootNode)
        return;

    // Otherwise get the index of the Node from the children of its parent
    // and append the new item right after it
    int index = selectedItem.getParent().getChildren().indexOf(selectedItem);
    selectedItem.getParent().getChildren().add(index+1, new TreeItem<>("New Item"));
});
Button b = new Button("Add");
b.setOnAction(event -> {
    // If there is no selection or the root is selected do nothing
    if (current == null || current == rootNode)
        return;

    // Otherwise get the index of the Node from the children of its parent
    // and append the new item right after it
    int index = current.getParent().getChildren().indexOf(current);
    current.getParent().getChildren().add(index+1, new TreeItem<>("New Item"));
});