如何在JavaFx中的CheckBoxTreeView中获取已检查项

时间:2017-03-16 08:28:29

标签: javafx

如何在JavaFx中的CheckBox TreeView中获取 Checked 项目? 我不知道如何实现这一目标......您只能获得选中的项目......

ObservableList<TreeItem<String>> items = treeHazardsXmi.getSelectionModel().getSelectedItems();

1 个答案:

答案 0 :(得分:4)

假设您正在使用CheckBoxTreeItem,您可以遍历树并测试每个selected属性:

ObservableSet<CheckBoxTreeItem<?>> checkedItems = FXCollections.observableHashSet();
findCheckedItems((CheckBoxTreeItem<?>) tree.getRoot(), checkedItems);

 // ...

private void findCheckedItems(CheckBoxTreeItem<?> item, ObservableSet<CheckBoxTreeItem<?>> checkedItems) {
    if (item.isSelected()) {
        checkedItems.add(item);
    }
    for (TreeItem<?> child : item.getChildren()) {
        findCheckedItems((CheckBoxTreeItem<?>) child, checkedItems);
    }
}

如果您有一棵非常大的树,计算量很大,您可以维护一组已检查的项目,并通过观察每个项目的selectedProperty,始终保持更新的设置。这里的缺点是你必须保持警惕,始终创建CheckBoxTreeItem,以便更新集合:

private ObservableSet<CheckBoxTreeItem<?>> checkedItems = FXCollections.observableHashSet();

private <T> CheckBoxTreeItem<T> createTreeItem(T value) {

    CheckBoxTreeItem<T> item = new CheckBoxTreeItem<>(value);

    item.selectedProperty().addListener((obs, wasChecked, isNowChecked) -> {
        if (isNowChecked) {
            checkedItems.add(item);
        } else {
            checkedItems.remove(item);
        }
    });

    return item ;
}

现在,只要您的商品是通过createTreeItem()方法创建的,checkedItems集就会始终包含已检查的商品。

请注意,如果您的树是动态的(在运行时添加和删除节点),则应该更进一步,如果项目已从树中删除,则取消注册侦听器(左侧作为读者练习...)。 / p>