[JavaFX]如果选中,检查每个 CheckBoxTreeItem

[JavaFX]Check every single CheckBoxTreeItem if selected

我需要检查 CheckBoxTreeItem 根目录中的每一项。

目前我只能检查根项而不是他们的子项。

public class Controller{


    @FXML Button button;



    @FXML
    private void press(MouseEvent event){

            System.out.println("Hello");

            System.out.println(checkBoxTreeItem.isSelected());

    }

     @FXML
     private TreeView<String> treeview;
     private CheckBoxTreeItem<String> checkBoxTreeItem;

     private CheckBoxTreeItem<String> rootItem;

     public void viewListFill() {
     rootItem.setExpanded(true);
     System.out.print("hhhhhh");
     treeview.setCellFactory(CheckBoxTreeCell.forTreeView());

     checkBoxTreeItem = new CheckBoxTreeItem("Völkerwanderung");
     rootItem.getChildren().add(checkBoxTreeItem);

     System.out.println( rootItem.isIndependent());


     checkBoxTreeItem = new CheckBoxTreeItem<>("b");
     rootItem.getChildren().add(checkBoxTreeItem);
     }


     public void initialize() {
     rootItem = new CheckBoxTreeItem<>("A");
     treeview.setRoot(rootItem);
     }

}

我在 oracle 文档中找不到任何内容。 我对回电很生气 observableValue

由于 rootItem 是给定数量的项目的父项,您只需遍历它们以检查它们的状态。像这样:

private boolean checkAllItemsSelected(){
    for(TreeItem item:rootItem.getChildren()){
        if(!((CheckBoxTreeItem)item).isSelected()){
            return false;
        }
    }
    return true;
}

如果是多层树,您可以创建递归方法。

编辑

如果您只需要知道是否选择了任何项目,这将 return 选择的数量,在控制台上打印他们的名字:

private int checkItemsSelected(){
    int count=0;
    for(TreeItem item:rootItem.getChildren()){
        if(((CheckBoxTreeItem)item).isSelected()){
            count++;
            System.out.println("item: "+item.getValue().toString());
        }
    }
    return count;
}

如果您正在寻找一些具体的项目:

private boolean checkItemIsSelected(String name){
    for(TreeItem item:rootItem.getChildren()){
        if(item.getValue().toString().equals(name)){
            return ((CheckBoxTreeItem)item).isSelected();
        }
    }
    return true;
}

首先感谢您的回答。但我的解释似乎并不准确。我需要检查是否有任何复选框被 selected。对于您的代码,只有当每个 children 都是 selected 或 root(即自动 select 全部)时,它才是正确的。但我需要找出哪些复选框是 selected.

public class Controller{

@FXML Button button;

@FXML
private void press(MouseEvent event){

        System.out.println("Hallo");
        System.out.println("Es ist selektiert: " +checkAllItemsSelected());
}

private boolean checkAllItemsSelected(){
    for(TreeItem item:rootItem.getChildren()){
        if(!((CheckBoxTreeItem)item).isSelected()){
            return false;
        }
    }
    return true;
}

 @FXML
 private TreeView<String> treeview;
 private CheckBoxTreeItem<String> checkBoxTreeItem;
 private CheckBoxTreeItem<String> rootItem;

 public void initialize() {

     rootItem = new CheckBoxTreeItem<>("Root Check");
     treeview.setRoot(rootItem);
     viewListFill();
}

 public void viewListFill() {

rootItem.setExpanded(true);
treeview.setCellFactory(CheckBoxTreeCell.forTreeView());

checkBoxTreeItem = new CheckBoxTreeItem("Check 1");
rootItem.getChildren().add(checkBoxTreeItem);

checkBoxTreeItem = new CheckBoxTreeItem<>("Check 2");
rootItem.getChildren().add(checkBoxTreeItem);


}

}