1

我在互联网上搜索,但没有看到任何一篇讨论这个非常有用的话题的帖子。这是我的问题。

我得到了一棵树,它在 TreeItem 的根和子节点上有 CheckBoxes。

我希望当用户检查 TreeItem 的根 CheckBox 时,所有子 CheckBox 和子根 CheckBox 都被选中。

例如,看看这张照片。 复选框树

我希望当用户选择“1 级”复选框时,“11 级”和“111 级”和“112 级”复选框被选中。当用户取消选择“Level 1”复选框时,未选中“Level 11”和“Level 111”和“Level 112”复选框。

当用户检查“Main”时,它的所有子项(“Level 1”、“Level 11”、“Level 111”和“Level 112”、“Level 2”、“Level 21”)都会被检查。当用户取消选中“Main”时,它将取消选中其所有子项。

但是,当用户选中“2 级”时,只选中了“21 级”。

注意:树的深度在高级中是未知的。

这是数据代码:

Tree myTree=new Tree();
TreeItem item1=new TreeItem(new CheckBox("Main"));
myTree.addItem(item1);
TreeItem item2=new TreeItem(new CheckBox("Level 1"));
item1.addItem(item2);
TreeItem item3=new TreeItem(new CheckBox("Level 11"));
item2.addItem(item3);
item3.addItem(new CheckBox("Level 111"));
item3.addItem(new CheckBox("Level 112"));

TreeItem item6=new TreeItem(new CheckBox("Level 2"));
item6.addItem(new CheckBox("Level 21"));
item1.addItem(item6);

这是我研究的代码,但它只达到 1 级

   Iterator<Widget> widgetsOfTree=myTree.iterator();

   TreeItem myTreeItem=myTree.getItem(0);
   for (int c=0; c<myTreeItem.getChildCount(); c++){
        TreeItem childTreeItem=myTreeItem.getChild(c);
        CheckBox myCheckBox=(CheckBox)childTreeItem.getWidget();
    }

这是基于 Mayank Pandya 提供的 traverseTree 方法的附加代码。当我单击“Main”或“Level 1”或“Level 2”复选框时,此代码有效,但当我单击其他复选框时它无法正常工作。例如,当单击“11 级”时,没有选择任何内容。

 myCheckBox.addClickHandler(new ClickHandler(){

        @Override
        public void onClick(ClickEvent event) {


            for(int i=0; i<myTree.getItemCount(); i++){
                TreeItem myTreeItem = myTree.getItem(i); 

                for (int c=0; c<myTreeItem.getChildCount(); c++){
                    TreeItem categoryTreeItem=myTreeItem.getChild(c);
                    CheckBox subCB=(CheckBox)categoryTreeItem.getWidget();

                    if(myCheckBox==subCB){

                        traverseTree(categoryTreeItem, myCheckBox.isChecked()) ;
                    }
                }


            }
  }

  });

我相信很多人都在寻找这个问题并希望我的问题可以帮助许多其他人。

4

1 回答 1

1

你可以试试这种遍历树的递归函数。

public void traverseTree(TreeItem item, Boolean checkValue) 
{    for(int i = 0; i < item.getChildCount(); i++) 
     {    

          // do action here 
          TreeItem childTreeItem=item.getChild(i);
          CheckBox myCheckBox=(CheckBox)childTreeItem.getWidget();
          myCheckBox.setChecked(checkValue);

          // recursive call for current node.
          traverseTree(childTreeItem,checkValue); 
     } 
} 

根据您的代码,您可以使用。

myCheckBox.addClickHandler(new ClickHandler(){

    @Override
    public void onClick(ClickEvent event) {

        for(int i=0; i<myTree.getItemCount(); i++){
            TreeItem myTreeItem = myTree.getItem(i); 
            CheckBox subCB=(CheckBox)myTreeItem.getWidget();

            if(myCheckBox==subCB){
                traverseTree(myTreeItem, myCheckBox.isChecked()) ;
            }
        }
   }

});

于 2013-05-18T18:23:13.580 回答