CheckBoxTreeItem上的TreeView一次性更改

时间:2017-06-07 12:38:27

标签: checkbox javafx treeview

我是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);
        }

    }

1 个答案:

答案 0 :(得分:1)

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

尝试使用下一个代码打印受影响复选框的名称:

    treeView.getRoot().addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), 
        event -> System.out.println("hello " + event.getTreeItem().getValue()));

例如,如果单击复选框“5”,您将获得以下日志:

hello 5
hello 1
hello 123

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

hello 6