我如何实施方法
private void wipeTreeViewStructure(TreeItem node)
其中“node”是一个TreeItem,它与所有连接的TreeItem一起在执行时被擦除?我尝试了一些
的方法 private void wipeTreeViewStructure(TreeItem node) {
for (TreeItem i : node.getChildren()) {
wipeTreeViewStructure(i);
i.delete();
}
}
但这有两个主要缺陷:
我在“i”中遇到“不兼容类型”错误,我不知道该怎么做。
显然没有为TreeItem实现delete()或任何类似的方法。
有了这么多未知数,我认为最好问问它是如何完成的。
答案 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);
}
}