Jface TreeViewer 设置选中

    开发时总会用到JFace封装的各种Viewer,它们虽然很方便,但在一些特殊情境下就不一定好使,比如TreeViewer,假定要在初始化以后自动选中某个模型对应的节点。

   TreeViewer提供了一个API方法——setSelection(),用了感觉没什么效果,跟了一下发现在org.eclipse.jface.viewers.StructuredViewer .setSelection(ISelection selection, boolean reveal)中

	public void setSelection(ISelection selection, boolean reveal) {
		/**
		 * 

* If the new selection differs from the current selection the hook * updateSelection is called. *

*

* If setSelection is called from within * preserveSelection, the call to * updateSelection is delayed until the end of * preserveSelection. *

*

* Subclasses do not typically override this method, but implement * setSelectionToWidget instead. *

*/ 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,这些都需要自己去调用相关处理方法。

 

 

 

你可能感兴趣的:(RCP)