我在互联网上搜索,但没有看到任何一篇文章讨论这个非常有用的话题。这是我的问题。
我得到了一个在根&上有CheckBoxes的树。在TreeItem的孩子身上。
我希望当用户检查TreeItem的根CheckBox时,那么所有子CheckBox&检查了子根复选框。
例如,看看这张照片。
我希望当用户选择“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()) ;
}
}
}
}
});
我相信很多人都在寻找这个问题。希望我的问题可以帮助许多其他人。
答案 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()) ;
}
}
}
});