treeviewer.setSelection(ISelection selection, boolean reveal)传true时无法选中子结点

有前同事问到此问题。
调试后发现,是由于TreeViewer的ContentProvider中没有实现getParent方法造成的。
关于getParent方法的说明如下:
  • public Object getParent(Object element)

The tree viewer calls its content provider’s getParent method when it needs to reveal collapsed domain objects programmatically and to set the expanded state of domain objects. This method should answer the parent of the domain object element.

在eclipse faq中也看到了相应的论述,如下:

How do I programmatically select an item in the tree?

Call the tree viewer’s setSelection(new StructuredSelection(<domain model>), true).

前提是需要实现树的ContentProvider的getParent方法。因为,要选中的是深层次的结点,就必须要从Root中去寻找(通过parent寻找孩子,注意,这里的parent是指Tree或TreeItem)  所以getParent必须正确实现。

另外,这里,Model的equals方法也是需要被正确实现的(内部是通过equlas来实现的)。

还有一个问题是,我们传进去的domain model,是从树中遍历获得,还是new一个匿名对象呢?
直接贴聊天记录吧:
 王学川  16:43:11
其中的参数model最好怎么处理,是需要new一个吗
乘客  16:43:16
内部都是通过equals处理的
你能得到想选中的model的instance吗
能,直接传好了 
王学川  16:43:43
是啊
这个对象,需要从根model里遍历得到
对比
对吧
乘客  16:44:17
不能,就只好自己构建了,但显然不适合equlas比较复杂或较大的对象了
王学川  16:45:07
哦,还是new效率高吧
否则还要从root开始遍历,直到找到要选中的model
乘客  16:45:34
new的对象也是一个临时的废弃对象  不好 
王学川  16:45:51
那只能遍历了
乘客  16:46:12
如果是小对象也可以采取这种试方式  比如你的对象的equlas只关注一两个属性,比如结点的名称,也可以new一个  
王学川  16:46:44
对,就关注文件的路径
一个
乘客  16:47:03
那可以new
王学川  16:47:21

乘客  16:47:23
这样,代码相对简单一些   

乘客  16:49:35
实际上,在动态的树中,你通过遍历是不太好的   如果你的树是随着你的添加删除改变的,试想,你还能通过getChildren().get(index)来获取吗    个数是变化的,index自然是发生改变 (当然,你通过遍历然后equals能规避这个问题)

若是通过简单的属性就可以定位到唯一的domail model,使用new创建domail model。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值