JavaFx CheckTreeView 如何检查未选中的项目?

JavaFx CheckTreeView how to check which item is unchecked?

我正在为 CheckTreeView 使用 ControlsFX。我在 CheckTreeView 中有很多元素,我不想遍历这棵树中的所有元素(因为树中元素的数量会花费很多时间)。有没有像checkTreeView.getLastUncheckedItem();这样的方法来获取最后一个未选中的。

目前我正在检查检查的元素数量并与计数器进行比较。

    If (CountPrev > Count){
//Something Unchecked Do Stuff
}

但同样,如果不遍历所有元素,我无法找到未选中的内容。

编辑:

当用户检查 CheckTreeView 上的项目时,我通过

获取该项目
String lastCheckedItem = checkTreeView.getCheckModel().
getCheckedItems().get(treeView.getCheckModel().getCheckedItems().size()-1).toString();

现在我需要这样的东西来处理未选中的项目

Stack<YourClassOfTheCheckModel> recentlyUnchcked = new Stack<YourClassOfTheCheckModel>();
yourTreeView.getSelectionModel().
selectedItemProperty().addListener( new ChangeListener() {

        @Override
        public void changed(ObservableValue observable, Object oldValue,
                Object newValue) {

            TreeItem<YourClassOfTheCheckModel> selectedItem = 
               (TreeItem<YourClassOfTheCheckModel>) newValue;
           CheckModel checkModel = checkTreeView.getCheckModel().
           bool checked = checkModel.isChecked (selectedItem);
           if(checked==false){
                recentlyUnchcked.push(yourObjectOfTheCheckModel);
           }
        }

      }); 

希望这会对您有所帮助或给您一个想法,尽管我不知道这是否可行(代码未测试,目前没有 IDE)。

取一个 ArrayList 'allItem' 并存储所有 TreeItems,然后 在 ObservableList 'Selecteditems' 中使用 getCheckedItems() 方法,现在删除 ArrayList 中的选定项目,例如 下面的代码:

这里 allTreeItems 是一个 CheckBoxTreeItem

List<String> allItem = new ArrayList<>();
for (int j = 0; j < allTreeItems.getValue().length(); j++) {
         allItem.add(allTreeItems.getChildren().get(j).getValue());
    }

if (CountPrev > Count) {
        ObservableList<TreeItem<String>> Selecteditems = checkTreeView.getCheckModel().getCheckedItems();
        allItem.remove(Selecteditems);

        System.out.println("UnChecked Item :" + allItem);

        for (int k = 0; k < allItem.size(); k++) {
            System.out.println(allItem.get(k));
        }
}

伙计们,非常感谢你们的帮助! 我接受了卡利普斯的回答,因为他为我的问题付出了时间和精力。 这就是我一直在寻找的:

   checkTreeView.getCheckModel().getCheckedItems().addListener(new ListChangeListener<TreeItem<String>>() {
        @Override public void onChanged(ListChangeListener.Change<? extends TreeItem<String>> change) {
            updateText(checkedItemsLabel, change.getList());

            while (change.next()) {
                System.out.println("============================================");
                System.out.println("Change: " + change);
                System.out.println("Added sublist " + change.getAddedSubList());
                System.out.println("Removed sublist " + change.getRemoved());
                System.out.println("List " + change.getList());
                System.out.println("Added " + change.wasAdded() + " Permutated " + change.wasPermutated() + " Removed " + change.wasRemoved() + " Replaced "
                        + change.wasReplaced() + " Updated " + change.wasUpdated());
                System.out.println("============================================");
            }
        }
    });

资源:

https://github.com/jinghai/controlsfx/blob/master/controlsfx-samples/src/main/java/org/controlsfx/samples/checked/HelloCheckTreeView.java