如何从 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();
}
}
但这有两个主要缺陷:
我在 "i" 中遇到 "Incompatible types" 错误,我不知道该怎么做。
显然没有为 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);
}
}
我将如何实现该方法
private void wipeTreeViewStructure(TreeItem node)
其中 "node" 是一个 TreeItem,它连同所有连接的 TreeItem 在执行时被删除?我尝试了一些类似
的方法 private void wipeTreeViewStructure(TreeItem node) {
for (TreeItem i : node.getChildren()) {
wipeTreeViewStructure(i);
i.delete();
}
}
但这有两个主要缺陷:
我在 "i" 中遇到 "Incompatible types" 错误,我不知道该怎么做。
显然没有为 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);
}
}