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

时间:2016-01-11 19:04:02

标签: recursion javafx treeview erase

我如何实施方法

private void wipeTreeViewStructure(TreeItem node)

其中“node”是一个TreeItem,它与所有连接的TreeItem一起在执行时被擦除?我尝试了一些

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

但这有两个主要缺陷:

  1. 我在“i”中遇到“不兼容类型”错误,我不知道该怎么做。

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

  3. 有了这么多未知数,我认为最好问问它是如何完成的。

1 个答案:

答案 0 :(得分:2)

您的不兼容类型错误(我认为)是因为您使用的是原始类型,而不是在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);
    }
}