swt的treeViewer.setSelection()无效

zhuago 2010-06-29 02:27:41
使用TreeViewer构建了一棵树,使用input方式,将root以list的方式取出,domain<RoadModel>中已经实现getChildren和getParent方法,但是发现指定节点被选中后,迭代寻找parent的时候已经到了root,还会执行getparent,直到返回null为止。请大大指点,以下为主要的几个类
RoadModelTreeView.java
package roadshow.views;


import java.util.ArrayList;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.part.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.jface.action.*;
import org.eclipse.ui.*;
import org.eclipse.swt.SWT;

import roadshow.business.RoadModelService;
import roadshow.pojos.RoadModel;
import roadshow.tree.TreeViewerContentProvider;
import roadshow.tree.TreeViewerLableProvider;


public class RoadModelTreeView extends ViewPart {
public static final String ID = "roadshow.views.RoadModelTreeView";
RoadModelService roadModelService = new RoadModelService();
public String roadModelId="";
public Tree tree;

/*
* The content provider class is responsible for
* providing objects to the view. It can wrap
* existing objects in adapters or simply return
* objects as-is. These objects may be sensitive
* to the current input of the view, or ignore
* it and always show the same content
* (like Task List, for example).
*/

class ViewContentProvider implements IStructuredContentProvider {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object parent) {
return new String[] { "One", "Two", "Three" };
}
}
class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
public String getColumnText(Object obj, int index) {
return getText(obj);
}
public Image getColumnImage(Object obj, int index) {
return getImage(obj);
}
public Image getImage(Object obj) {
return PlatformUI.getWorkbench().
getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
}
}
class NameSorter extends ViewerSorter {
}

/**
* The constructor.
*/
public RoadModelTreeView() {
}

/**
* This is a callback that will allow us
* to create the viewer and initialize it.
*/
public void createPartControl(Composite parent) {
final TreeViewer treeViewer = new TreeViewer(parent,SWT.BORDER);

tree = treeViewer.getTree();
treeViewer.setContentProvider(new TreeViewerContentProvider());
treeViewer.setLabelProvider(new TreeViewerLableProvider());
ArrayList<RoadModel> rootList = roadModelService.getRootRoadModel();//得到根节点
treeViewer.setInput(rootList);
//做一个判断,选中最小节点,并将节点展开
if(rootList.size()>0){
RoadModel roadModel = (RoadModel)rootList.get(0);
RoadModel miniModel = roadModelService.getMiniFirstNode(roadModel.getId());
ISelection selection = new StructuredSelection(new Object[]{miniModel});
treeViewer.setSelection(selection);
treeViewer.expandToLevel(miniModel, 8);
treeViewer.getTree().showSelection();
roadModelId = miniModel.getId();
}
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection)treeViewer
.getSelection();
System.out.println("选中前模型=="+roadModelId);
RoadModel roadModel = (RoadModel)selection.getFirstElement();
roadModelId = roadModel.getId();
System.out.println("选中模型=="+roadModelId);
updateStatusline(event);
}
});
makeActions();
hookContextMenu();
hookDoubleClickAction();
contributeToActionBars();
}

public void expand(TreeViewer treeViewer,RoadModel model){
System.out.println("逐级展开=="+model.toString());
if(model.getParent()!=null){
treeViewer.expandToLevel(model, 1);
expand(treeViewer,model.getParent());
}
}

private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
RoadModelTreeView.this.fillContextMenu(manager);
}
});
}

private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}

private void fillLocalPullDown(IMenuManager manager) {
manager.add(new Separator());
}

private void fillContextMenu(IMenuManager manager) {
// manager.add(action1);
// manager.add(action2);
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}

private void fillLocalToolBar(IToolBarManager manager) {
}

private void makeActions() {
}

private void hookDoubleClickAction() {
}
private void showMessage(String message) {
// MessageDialog.openInformation(
// viewer.getControl().getShell(),
// "模型树",
// message);
}

/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
// viewer.getControl().setFocus();
}

protected void updateStatusline(SelectionChangedEvent event) {
IStatusLineManager statusline = this.getViewSite().getActionBars().getStatusLineManager();
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
String msg = getSelectionMessage(selection);
System.out.println("\t选择了:"+msg);
statusline.setMessage(msg);
}

private String getSelectionMessage(IStructuredSelection selection) {
if (selection.isEmpty()) {
return "";
}
if (selection.size() == 1) {
return selection.getFirstElement().toString();
}
return selection.size() + " items selected";
}

public void initData(){

}


}

...全文
426 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuago 2010-06-29
  • 打赏
  • 举报
回复
1. setSelection(obj)不管用检查下面几点:
a) 这个obj是否和你要选中的(就是Input里的对象)是否同一个?
两者确定是同一个
b) 如果不是,确定equals方法和hashCode方法相等?
同上
c) getParent()是否正确?
getParent()是正确的,直到root的list中的对象,但到了个根节点还是继续执行getParent方法来构造treepath
2. treeViewer.setSelection(selection);
treeViewer.expandToLevel(miniModel, 8);
treeViewer.getTree().showSelection();

这一堆代码应该可以用treeViewer.setSelection(selection, true);代替
谢谢你的这条建议
霜之哀伤 2010-06-29
  • 打赏
  • 举报
回复
代码太多了...

1. setSelection(obj)不管用检查下面几点:
a) 这个obj是否和你要选中的(就是Input里的对象)是否同一个?
b) 如果不是,确定equals方法和hashCode方法相等?
c) getParent()是否正确?

2. treeViewer.setSelection(selection);
treeViewer.expandToLevel(miniModel, 8);
treeViewer.getTree().showSelection();

这一堆代码应该可以用treeViewer.setSelection(selection, true);代替
zhuago 2010-06-29
  • 打赏
  • 举报
回复

TreeViewerContentProvider.java
/** 
* 2010-6-24
* TreeViewerContentProvider.java
* author:aiguo zhuang
*/

package roadshow.tree;

import java.util.List;

import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;

import roadshow.business.RoadModelService;
import roadshow.pojos.RoadModel;

/**
* @author Administrator
*
*/
public class TreeViewerContentProvider implements ITreeContentProvider {
RoadModelService roadModelService = new RoadModelService();

/**
* 由这个方法决定父结点应该显示哪些子结点
* parent 当前被单击的结点对象
* return 由子结点作为元素的数组
*/
public Object[] getChildren(Object parentElement) {
RoadModel roadModel = (RoadModel) parentElement;
String id = roadModel.getId();
List list = roadModelService.getChildRoadModelByParentId(id);
if(list == null || list.isEmpty()) {
return new Object[0];
}else {
return list.toArray();
}
}

/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
public Object getParent(Object element) {
return ((RoadModel)element).getParent();


}

/**
* 判断某结点是否有子结点。如果有子结点,这时结点前都有一逐步形成“+”号图标
* parent需要判断是否有子结点
* return false无子结点,true有子结点
*/
public boolean hasChildren(Object element) {
RoadModel roadModel = (RoadModel) element;
String id = roadModel.getId();
List list = roadModelService.getChildRoadModelByParentId(id);
if(list == null || list.isEmpty()) {
return false;
}else {
return true;
}
}

/* (non-Javadoc)
* 得到根节点
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
// TODO Auto-generated method stub
if(inputElement instanceof List) {
List list = (List) inputElement;
return list.toArray();
}else {
return new Object[0];
}
}

/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
// TODO Auto-generated method stub

}

/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
// TODO Auto-generated method stub

}

}

**************************************************************************************
TreeViewerLableProvider.java

/**
* 2010-6-24
* TreeViewerLableProvider.java
* author:aiguo zhuang
*/

package roadshow.tree;

import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;

import roadshow.business.RoadModelService;
import roadshow.pojos.RoadModel;

/**
* @author Administrator
*
*/
public class TreeViewerLableProvider implements ILabelProvider {
RoadModelService roadModelService = new RoadModelService();
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
*/
public Image getImage(Object element) {
String imageKey = ISharedImages.IMG_OBJ_PROJECT;//图片路径

return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
}

/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/
public String getText(Object element) {
RoadModel roadModel = (RoadModel) element;
String nodeName = roadModel.toString();
return nodeName;
}

/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
public void addListener(ILabelProviderListener arg0) {
// TODO Auto-generated method stub

}

/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/
public void dispose() {
// TODO Auto-generated method stub

}

/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/
public boolean isLabelProperty(Object arg0, String arg1) {
// TODO Auto-generated method stub
return false;
}

/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
public void removeListener(ILabelProviderListener arg0) {
// TODO Auto-generated method stub

}

}

58,452

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧