JavaFX:单击CheckBoxTreeItem时获取选定的值 [英] JavaFX : Get the selected value when CheckBoxTreeItem clicked

查看:601
本文介绍了JavaFX:单击CheckBoxTreeItem时获取选定的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在 TreeView 中包含所有包含 CheckBoxTreeItem s的选定值。

I want to get all the selected values in TreeView containing CheckBoxTreeItems.

如何实现?

推荐答案

您可以在根目录上收听事件,以使 Set< TreeItem> 保持最新,或者可以

You can listen to the events on the root to keep a Set<TreeItem> up to date or you can do a DFS for selected items starting at the root.

请注意,DFS方法当然需要较少的代码量,但是另一种方法允许您保留设置到目前为止在修改过程中...

Note that the DFS approach certainly requires the smaller amount of code, but the other approach allows you to keep the set up to date during modifications...

@Override
public void start(Stage primaryStage) {
    CheckBoxTreeItem<String> root = new CheckBoxTreeItem<>("root");
    CheckBoxTreeItem<String> c1 = new CheckBoxTreeItem<>("c1");
    c1.getChildren().addAll(
            new CheckBoxTreeItem<>("c1.1"),
            new CheckBoxTreeItem<>("c1.2"),
            new CheckBoxTreeItem<>("c1.3")
    );
    CheckBoxTreeItem<String> c2 = new CheckBoxTreeItem<>("c2");
    c2.getChildren().addAll(
            new CheckBoxTreeItem<>("c2.1"),
            new CheckBoxTreeItem<>("c2.2"),
            new CheckBoxTreeItem<>("c2.3")
    );
    CheckBoxTreeItem<String> c3 = new CheckBoxTreeItem<>("c3");
    c3.getChildren().addAll(
            new CheckBoxTreeItem<>("c3.1"),
            new CheckBoxTreeItem<>("c3.2"),
            new CheckBoxTreeItem<>("c3.3")
    );
    root.getChildren().addAll(c1, c2, c3);

    TreeView<String> treeView = new TreeView<>(root);
    treeView.setCellFactory(CheckBoxTreeCell.forTreeView());
    Set<TreeItem<String>> selected = new HashSet<>();

    // listen for selection change
    root.addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), (CheckBoxTreeItem.TreeModificationEvent<String> evt) -> {
        CheckBoxTreeItem<String> item = evt.getTreeItem();

        if (evt.wasIndeterminateChanged()) {
            if (item.isIndeterminate()) {
                selected.remove(item);
            } else if (item.isSelected()) {
                selected.add(item);
            }
        } else if (evt.wasSelectionChanged()) {
            if (item.isSelected()) {
                selected.add(item);
            } else {
                selected.remove(item);
            }
        }
    });

    // listen for subtree add/remove
    root.addEventHandler(TreeItem.childrenModificationEvent(), (TreeItem.TreeModificationEvent<String> evt) -> {
        if (evt.wasAdded()) {
            for (TreeItem<String> added : evt.getAddedChildren()) {
                addSubtree(selected, (CheckBoxTreeItem<String>) added);
            }
        }
        if (evt.wasRemoved()) {
            for (TreeItem<String> removed : evt.getRemovedChildren()) {
                removeSubtree(selected, (CheckBoxTreeItem<String>) removed);
            }
        }
    });

    Button button = new Button("print selected");
    button.setOnAction(evt -> {
        System.out.println("----------------");
        selected.stream().map(TreeItem::getValue).forEach(System.out::println);
    });

    Button button2 = new Button("print dfs");
    button2.setOnAction(evt -> {
        System.out.println("----------------");
        print(root);
    });

    Button remove = new Button("remove");
    remove.setOnAction(evt -> {
        root.getChildren().remove(c3);
    });

    Scene scene = new Scene(new VBox(treeView, button, button2, remove));

    primaryStage.setScene(scene);
    primaryStage.show();
}

private static <T> void removeSubtree(Collection<TreeItem<T>> collection, CheckBoxTreeItem<T> item) {
    if (item.isSelected()) {
        collection.remove(item);
    } else if (!item.isIndeterminate() && !item.isIndependent()) {
        return;
    }
    for (TreeItem<T> child : item.getChildren()) {
        removeSubtree(collection, (CheckBoxTreeItem<T>) child);
    }
}

private static <T> void addSubtree(Collection<TreeItem<T>> collection, CheckBoxTreeItem<T> item) {
    if (item.isSelected()) {
        collection.add(item);
    } else if (!item.isIndeterminate() && !item.isIndependent()) {
        return;
    }
    for (TreeItem<T> child : item.getChildren()) {
        addSubtree(collection, (CheckBoxTreeItem<T>) child);
    }
}

private static <T> void print(CheckBoxTreeItem<T> item) {
    if (item.isSelected()) {
        System.out.println(item.getValue());
    } else if (!item.isIndeterminate() && !item.isIndependent()) {
        return;
    }
    for (TreeItem<T> child : item.getChildren()) {
        print((CheckBoxTreeItem<T>) child);
    }
}

这篇关于JavaFX:单击CheckBoxTreeItem时获取选定的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆