如果节点的深度未知(GWT),如何循环树窗口小部件?

时间:2013-05-18 05:11:53

标签: gwt loops tree widget

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

我得到了一个在根&上有CheckBoxes的树。在TreeItem的孩子身上。

我希望当用户检查TreeItem的根CheckBox时,那么所有子CheckBox&检查了子根复选框。

例如,看看这张照片。 CheckBox Tree

我希望当用户选择“Level 1”CheckBox然后“Level 11”& “等级111”&检查了“112级”复选框。当用户取消选择“Level 1”CheckBox然后“Level 11”& “等级111”& “级别112”复选框未选中。

当用户检查“主要”时,其所有子女(“等级1”,“等级11”,“等级111”和“等级112”,“等级2”,“等级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();
    }

这是基于提供的traverseTree方法的附加代码 Mayank Pandya。当我单击“Main”或“Level 1”或“Level 2”CheckBox时,此代码有效,但当我单击其他复选框时,它无法正常工作。例如,点击“等级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()) ;
                    }
                }


            }
  }

  });

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

1 个答案:

答案 0 :(得分: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()) ;
            }
        }
   }

});