浏览 4753 次
锁定老帖子 主题:Jface TreeViewer 设置选中
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-07
开发时总会用到JFace封装的各种Viewer,它们虽然很方便,但在一些特殊情境下就不一定好使,比如TreeViewer,假定要在初始化以后自动选中某个模型对应的节点。 TreeViewer提供了一个API方法——setSelection(),用了感觉没什么效果,跟了一下发现在org.eclipse.jface.viewers.StructuredViewer .setSelection(ISelection selection, boolean reveal)中 public void setSelection(ISelection selection, boolean reveal) { /** * <p> * If the new selection differs from the current selection the hook * <code>updateSelection</code> is called. * </p> * <p> * If <code>setSelection</code> is called from within * <code>preserveSelection</code>, the call to * <code>updateSelection</code> is delayed until the end of * <code>preserveSelection</code>. * </p> * <p> * Subclasses do not typically override this method, but implement * <code>setSelectionToWidget</code> instead. * </p> */ Control control = getControl(); if (control == null || control.isDisposed()) { return; } if (!inChange) { setSelectionToWidget(selection, reveal); ISelection sel = getSelection(); //此处为null updateSelection(sel); firePostSelectionChanged(new SelectionChangedEvent(this, sel)); } else { restoreSelection = false; setSelectionToWidget(selection, reveal); } }
ISelection sel = getSelection(); //此处为null 工作有点紧急,没有仔细跟踪,想着Tree本身有select()方法,绕一下先实现了再说。 JFaeUtil类: public class JFaceUtil { private JFaceUtil() { } /** * Get the matching tree item. * * Call {@link #getItemIndex(Tree, Object)} * * @param tree * - Control * @param obj * - the object data * @return - if matching return the matching item, otherwise null. */ public static TreeItem getItem(Tree tree, Object obj) { int index = getItemIndex(tree, obj); if (index == -1) { return null; } return tree.getItem(index); } /** * Get the matching tree item index. * * @param tree * - Control * @param obj * - the object data * @return - if matching return the matching item index, otherwise -1. */ public static int getItemIndex(Tree tree, Object obj) { if (tree == null || obj == null) { return -1; } for (int index = 0; index < tree.getItemCount(); index++) { TreeItem item = tree.getItem(index); if (item.getData() == obj) { return index; } } return -1; } } 方法有点土,但还是实现了。不过这个选中不会触发TreeViewer的SelectionListener监听器,以及SelectionChangedListener,这些都需要自己去调用相关处理方法。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-09-07
后来又细细跟踪了代码,发现
setSelectionToWidget(selection, reveal); 函数执行的有问题,应该是TreeViewer对应的Tree控件没有及时刷新出新的TreeItem,所以在 引用 org.eclipse.jface.viewers.StructuredViewer.findItem(Object element) 中就得不到对应的Item。这里把修改后的代码也贴一下,应该就可以了。 TreeViewer treeViewer = ....; ...... treeViewer.refresh(); StructuredSelection s = new StructuredSelection(obj); treeViewer.setSelection(s, true); 这个方法会触发SelectionChangedEvent,但好像不会触发SelectionEvent |
|
返回顶楼 | |
发表时间:2011-06-28
setSelection() 是可以用的。应该是你设置的不对
|
|
返回顶楼 | |
发表时间:2011-06-28
wuyufeixue 写道 setSelection() 是可以用的。应该是你设置的不对
确实可以 那会用错了 |
|
返回顶楼 | |