RCP 多选框 树

  private void checkItem(TreeItem item,List<Object> authorities){
  checkItem(item,authorities,false,false);
 }
 
 private void checkItem(TreeItem item, List<Object> allCheckedElements,boolean isParent,boolean isChild){
  //此处树已经构建完成,所以在判断是父节点还是子节点是直接根据树的物理结构判断,而不需要再考虑逻辑
  if(!isChild){
   if(item.getItemCount() != 0)
    isParent = true;   
  }
  
  if(item.getParentItem() != null){
   isChild = true;
  } else {
   isChild = false;
  }
  if (isParent) { // 是父节点时应该选中该选中该节点时级联选中其下的所有子节点,取消选中时同理
   TreeItem[] children = item.getItems();
   Object o = item.getData();
   if (item.getChecked()) { //选中该父节点时,它所有的子节点也要被选中
    if(!allCheckedElements.contains(o))
     allCheckedElements.add(o);// 将选中的节点放入到allCheckedElements中
    for (int i = 0; i < children.length; i++) {
     children[i].setChecked(true);
     checkItem(children[i],allCheckedElements);
    }
   } else {// 取消选中时它的所有子节点也同时被取消选中
    if(allCheckedElements.contains(o))
     allCheckedElements.remove(o);//如果选中的节点之前在allCheckedElements中,则移除
    for (int i = 0; i < children.length; i++) {
     children[i].setChecked(false);
     checkItem(children[i],allCheckedElements);
    }
   }
  }
  if (isChild) {// 不是父节点
   TreeItem[] brotheres = item.getParentItem().getItems();// 获得它的所有的兄弟节点
   Object o = item.getData();
   if (item.getChecked()) {
    if(!allCheckedElements.contains(o))
     allCheckedElements.add(o);// 将选中的节点加入到allCheckedElements中
   } else {
    if(allCheckedElements.contains(o))//如果之前allCheckedElements中没有包含该节点则加入
     allCheckedElements.remove(o);
   }
   boolean hasBrotherChecked = false;
   for (TreeItem brother : brotheres) {// 判断它的兄弟节点中有没有被选中的
    if (brother.getChecked()) {
     hasBrotherChecked = true;
     break;
    }    
   }
   
   if(hasBrotherChecked){//如果兄弟节点中有被选中的那么父节点也被选中
    item.getParentItem().setChecked(true);
    Object po = item.getParentItem().getData();
    if(!allCheckedElements.contains(po))
     allCheckedElements.add(po);
    checkItem(item.getParentItem(),allCheckedElements,false,true);
   } else {//相么如果兄弟节点中一个都没有被选中的,那么父节点也不应被选中
    item.getParentItem().setChecked(false);
    Object po = item.getParentItem().getData();
    if(allCheckedElements.contains(po))
     allCheckedElements.remove(po);
    checkItem(item.getParentItem(),allCheckedElements,false,true);
   }   
  }
 }

 

 

 

 

 

 

 

 

 

 

 

 

  tree.addSelectionListener(new SelectionListener(){
   @Override
   public void widgetDefaultSelected(SelectionEvent e) {
    // TODO Auto-generated method stub
    
   }
   @Override
   public void widgetSelected(SelectionEvent e) {
    // TODO Auto-generated method stub
    
    TreeItem item = (TreeItem) e.item;
    tree.setSelection(item);
    List authorities = new ArrayList<Object>();
    checkItem(item,authorities);
   }
   
  });

 

 

 

 

 

Tree tree = new Tree(container, SWT.BORDER | SWT.CHECK);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值