TreeView CheckBoxTreeItem更改上的一次一个hander

TreeView CheckBoxTreeItem更改上的一次一个hander,checkbox,javafx,treeview,Checkbox,Javafx,Treeview,我是JavaFX的初学者 我需要为我的TreeView复选框中的任何更改创建一次一个处理程序。现在,它可以像同时处理所有选定节点一样工作 谢谢你的帮助。这是我的密码: package sample; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.CheckBoxTreeItem; import javafx.sce

我是JavaFX的初学者

我需要为我的
TreeView
复选框中的任何更改创建一次一个处理程序。现在,它可以像同时处理所有选定节点一样工作

谢谢你的帮助。这是我的密码:

    package sample;

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.CheckBoxTreeItem;
    import javafx.scene.control.TreeView;
    import javafx.scene.control.cell.CheckBoxTreeCell;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Stage;

    public class Main extends Application {

        @Override
        public void start(Stage primaryStage) throws Exception{
            BorderPane root = new BorderPane();
            root.setCenter(initTreeView());
            primaryStage.setTitle("Hello World");
            primaryStage.setScene(new Scene(root, 300, 275));

            primaryStage.show();
        }

        public TreeView initTreeView() {
            TreeView<String> treeView = new TreeView<>();
            treeView.setRoot(new CheckBoxTreeItem<>("123"));
            treeView.getRoot().addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), event -> System.out.println("hello"));
            treeView.setCellFactory(p -> new CheckBoxTreeCell<>());
            treeView.getRoot().getChildren().addAll(new CheckBoxTreeItem<>("1"),new CheckBoxTreeItem<>("2"), new CheckBoxTreeItem<>("3"));
            treeView.getRoot().getChildren().get(0).getChildren().addAll(new CheckBoxTreeItem<>("4"),new CheckBoxTreeItem<>("5"), new CheckBoxTreeItem<>("6"));
            treeView.getRoot().getChildren().get(1).getChildren().addAll(new CheckBoxTreeItem<>("7"),new CheckBoxTreeItem<>("8"), new CheckBoxTreeItem<>("9"));
            treeView.getRoot().getChildren().get(2).getChildren().addAll(new CheckBoxTreeItem<>("10"),new CheckBoxTreeItem<>("11"), new CheckBoxTreeItem<>("12"));
            return treeView;
        }


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

    }
包装样品;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.CheckBoxTreeItem;
导入javafx.scene.control.TreeView;
导入javafx.scene.control.cell.CheckBoxTreeCell;
导入javafx.scene.layout.BorderPane;
导入javafx.stage.stage;
公共类主扩展应用程序{
@凌驾
public void start(Stage primaryStage)引发异常{
BorderPane根=新的BorderPane();
setCenter(initTreeView());
setTitle(“你好世界”);
初级阶段。设置场景(新场景(根,300275));
primaryStage.show();
}
公共树视图initTreeView(){
TreeView TreeView=新的TreeView();
setRoot(新的CheckBoxTreeItem(“123”));
treeView.getRoot().addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(),事件->系统.out.println(“hello”);
setCellFactory(p->new CheckBoxTreeCell());
treeView.getRoot().getChildren().addAll(新的CheckBoxTreeItem(“1”)、新的CheckBoxTreeItem(“2”)、新的CheckBoxTreeItem(“3”);
treeView.getRoot().getChildren().get(0.getChildren().addAll(新CheckBoxTreeItem(“4”)、新CheckBoxTreeItem(“5”)、新CheckBoxTreeItem(“6”);
treeView.getRoot().getChildren().get(1.getChildren().addAll(新CheckBoxTreeItem(“7”)、新CheckBoxTreeItem(“8”)、新CheckBoxTreeItem(“9”);
treeView.getRoot().getChildren().get(2.getChildren().addAll(新CheckBoxTreeItem(“10”)、新CheckBoxTreeItem(“11”)、新CheckBoxTreeItem(“12”);
返回树视图;
}
公共静态void main(字符串[]args){
发射(args);
}
}

实际上它工作正常。每个更改的复选框节点都会调用一次事件处理程序。请注意,更改子节点也会影响父节点,因此您会得到多个事件句柄调用

请尝试下一个代码,该代码将打印受影响复选框的名称:

    treeView.getRoot().addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), 
        event -> System.out.println("hello " + event.getTreeItem().getValue()));
例如,如果单击复选框“5”,您将获得以下日志:

hello 5
hello 1
hello 123
因为所有父节点的状态也已更改(从未选中状态更改为中间“-”状态)。如果在此之后单击“6”,则只有一个复选框受影响,输出将为:

hello 6

那么您想监听复选框中的任何更改吗?是的,任何更改,但只有一次,如果是针对独立节点的更改