如何从 javafx 中的 TreeView 中删除分支 TreeItems?

How to delete branching TreeItems from a TreeView in javafx?

我将如何实现该方法

private void wipeTreeViewStructure(TreeItem node)

其中 "node" 是一个 TreeItem,它连同所有连接的 TreeItem 在执行时被删除?我尝试了一些类似

的方法
    private void wipeTreeViewStructure(TreeItem node) {
    for (TreeItem i : node.getChildren()) {
        wipeTreeViewStructure(i);
        i.delete();
    }
}

但这有两个主要缺陷:

  1. 我在 "i" 中遇到 "Incompatible types" 错误,我不知道该怎么做。

  2. 显然没有为 TreeItem 实现 delete() 或任何类似方法。

有这么多未知数,我想问问它是怎么做的会更好。

您的不兼容类型错误是(我认为)因为您使用的是原始类型,而不是在 TreeItem 中正确指定对象的类型。换句话说,你应该使用

TreeItem<Something>

而不仅仅是原始的

TreeItem

Something 是您在树中用作数据的任何内容。你的 IDE 应该给你很多警告。

这里根本不需要递归。要删除树项,只需将其从其父节点的子节点列表中删除即可。它会有效地带走它的所有后代。你可以做到

node.getParent().getChildren().remove(node);

这应该可以满足您的所有需求。 (如果节点可能是树的根,那么您应该首先检查它。)

SSCCE:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class TreeViewWithDelete extends Application {

    @Override
    public void start(Stage primaryStage) {
        TreeItem<String> treeRoot = new TreeItem<>("Root");
        treeRoot.setExpanded(true);

        TreeView<String> tree = new TreeView<>(treeRoot);
        tree.getSelectionModel().select(treeRoot);

        Button delete = new Button("Delete");


        delete.setOnAction(e -> {
            TreeItem<String> selected = tree.getSelectionModel().getSelectedItem();
            selected.getParent().getChildren().remove(selected);
        });


        delete.disableProperty().bind(tree.getSelectionModel().selectedItemProperty().isNull()
                .or(tree.getSelectionModel().selectedItemProperty().isEqualTo(treeRoot)));

        TextField textField = new TextField();
        Button add = new Button("Add");
        EventHandler<ActionEvent> addAction = e -> {
            TreeItem<String> selected = tree.getSelectionModel().getSelectedItem();
            if (selected == null) {
                selected = treeRoot ;
            }
            String text = textField.getText();
            if (text.isEmpty()) {
                text = "New Item";
            }
            TreeItem<String> newItem = new TreeItem<>(text);
            selected.getChildren().add(newItem);
            newItem.setExpanded(true);
            tree.getSelectionModel().select(newItem);
        };
        textField.setOnAction(addAction);
        add.setOnAction(addAction);

        HBox controls = new HBox(5, textField, add, delete);
        controls.setAlignment(Pos.CENTER);
        controls.setPadding(new Insets(5));

        BorderPane root = new BorderPane(tree, null, null, controls, null);
        Scene scene = new Scene(root, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}