javafx - 从 TreeView 中删除节点

标签 javafx javafx-2 javafx-8

我想用上下文菜单创建这个简单的 javaFX TreeView 示例,它可以从树中删除节点:

public class TreeViewSample extends Application {

    private final Node rootIcon = new ImageView(
        new Image(getClass().getResourceAsStream("folder_16.png"))
    );

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

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Tree View Sample");        

        TreeItem<String> rootItem = new TreeItem<String> ("Inbox", rootIcon);
        rootItem.setExpanded(true);
        for (int i = 1; i < 6; i++) {
            TreeItem<String> item = new TreeItem<String> ("Message" + i);            
            rootItem.getChildren().add(item);
        }        
        TreeView<String> tree = new TreeView<String> (rootItem);        
        StackPane root = new StackPane();
        root.getChildren().add(tree);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

我测试了这个上下文菜单以删除右键单击选定的节点:
final ContextMenu contextMenu = new ContextMenu();
        MenuItem item1 = new MenuItem("About");
        item1.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {
                System.out.println("About");
            }
        });
        MenuItem item2 = new MenuItem("Preferences");
        item2.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {
                System.out.println("Preferences");
            }
        });
        MenuItem item3 = new MenuItem("Remove");
        item3.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent e)
            {

                DynamicTreeNodeModel c = treeView.getSelectionModel().getSelectedItem().getValue();
                boolean remove = treeView.getSelectionModel().getSelectedItem().getChildren().remove(c);
                System.out.println("Remove");
            }
        });
        contextMenu.getItems().addAll(item1, item2, item3);

        treeView.setContextMenu(contextMenu);

由于某种原因,代码不起作用。你能帮我解决这个问题吗?

最佳答案

您正在尝试从其自己的子节点中删除所选节点。因为它不存在那里,所以什么都不会发生。您需要从其父节点的子节点中删除所选节点。

    MenuItem item3 = new MenuItem("Remove");
    item3.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent e) {
            TreeItem c = (TreeItem)treeView.getSelectionModel().getSelectedItem();
            boolean remove = c.getParent().getChildren().remove(c);
            System.out.println("Remove");
        }
    });

关于javafx - 从 TreeView 中删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22117411/

相关文章:

java - 通过for循环将节点添加到面板时出错

java - 从另一个线程更新 JavaFX UI

JavaFx:TreeTableView 奇怪的 NullpointerException

JavaFX 文本双下划线间距

drag-and-drop - 在 JavaFX 表中拖放?

performance - JavaFX 吃掉我的内存?

javafx-8 - 如何忽略 javafx 中的 60fps 限制?

JavaFX JDK 9.0.4 ListView celFactory 添加空单元格

java - 将 person.city.name 添加到 TableView

java - 在 JavaFx 中处理和扩展 Node 的正确方法