论坛首页 Java企业应用论坛

Jface TreeViewer 设置选中

浏览 4753 次
精华帖 (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,这些都需要自己去调用相关处理方法。

 

 

 

   发表时间: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
0 请登录后投票
   发表时间:2011-06-28  
setSelection() 是可以用的。应该是你设置的不对
0 请登录后投票
   发表时间:2011-06-28  
wuyufeixue 写道
setSelection() 是可以用的。应该是你设置的不对


确实可以 那会用错了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics