ContainerCheckedTreeViewer 设置初始选中状态问题

阿_布 2010-08-21 06:49:48
用ContainerCheckedTreeViewer构建一颗带复选框的树之后,要根据用户上次的设置保持初始选中状态,比如:

如果用户上次选择了中国,则中国下面所有子节点前面的复选框都为选中状态,如果用户只选择了北京,则只有中国和北京下面的子节点为选中状态,现在有一个问题,就是只能设置根节点的选中状态,即如果用户上次选择了中国,则可以在初始化树的时候设置中国及以下的节点为选中状态;如果用户只选择了北京,则没有办法只设置中国、北京及以下的节点为选中状态。有遇到过这个问题的兄弟请指导一下小弟,不慎感激!

中国
--北京
--中关村
--三元桥
--上海
--浦东
--广州
--天河
--白云
美国
--纽约
--曼哈顿
--休斯顿
...全文
396 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zings1986 2011-08-10
  • 打赏
  • 举报
回复
也遇到这个问题,苦于没人给回答,还好后来解决了。。
private ContainerCheckedTreeViewer checkboxTreeViewer;


checkboxTreeViewer.expandAll(); // 展开树结构(这句很重要)

TreeItem[] items = checkboxTreeViewer.getTree().getItems();

// 若树中有数据
if (items.length > 0) {
Object data = items[0].getData(); // 根节点数据
List<Object> childs = ((Itree) data).getChildren(); // 根节点下的子节点集合

//对子节点集合
for (Object child : childs) {
//所选中的话务模型
checkboxTreeViewer.setChecked(child, true);

}
}
阿_布 2010-08-21
  • 打赏
  • 举报
回复
数据类:

Itree.java

package model;

import java.util.List;

public interface Itree {
public String getName();
public void setName(String name);
public void setChildren(List Children);
public List getChildren();
}

People.java

package model;

import java.util.List;

public class People implements Itree {
private Long id;
private String name;

public People() {
}

public People(String name) {
this.name = name;
}

public List getChildren() {
return null;
}

public void setChildren(List children) {
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

City.java

package model;

import java.util.ArrayList;
import java.util.List;

public class City implements Itree {
private Long id;
private String name;
private List children = new ArrayList();

public City() {
}

public City(String name) {
this.name = name;
}

public List getChildren() {
return children;
}

public void setChildren(List children) {
this.children = children;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

Country.java

package model;

import java.util.ArrayList;
import java.util.List;

public class Country implements Itree {
private Long id;
private String name;
private List children = new ArrayList();

public Country() {
}

public Country(String name) {
this.name = name;
}

public List getChildren() {
return children;
}

public void setChildren(List children) {
this.children = children;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

Factory.java 产生数数据的类

package model;

import java.util.ArrayList;
import java.util.List;

public class Factory {
@SuppressWarnings("unchecked")
public static List createTree() {
// 生成国家
Country cn = new Country("中国");
Country us = new Country("美国");
Country jp = new Country("日本");
// 生成城市
City beijing = new City("北京");
City shanghai = new City("上海");
City shenzhen = new City("深圳");
City newyork = new City("纽约");
City la = new City("洛杉矶");
City tokyo = new City("东京");
City osaka = new City("大阪");
// 北京人
ArrayList list = new ArrayList();
list.add(new People("张三"));
list.add(new People("李四"));
list.add(new People("王五"));
beijing.setChildren(list);
// 上海人
list = new ArrayList();
list.add(new People("翠花"));
list.add(new People("小红"));
list.add(new People("小崔"));
shanghai.setChildren(list);
//深圳人
list = new ArrayList();
list.add(new People("小三"));
list.add(new People("小四"));
shenzhen.setChildren(list);
// 纽约人
list = new ArrayList();
list.add(new People("tom"));
list.add(new People("rose"));
list.add(new People("john"));
newyork.setChildren(list);
// 洛杉矶人
list = new ArrayList();
list.add(new People("Sofia"));
list.add(new People("sarah"));
list.add(new People("Jennifer"));
la.setChildren(list);
// 东京人
list = new ArrayList();
list.add(new People("渡边"));
list.add(new People("鬼冢"));
list.add(new People("山本"));
tokyo.setChildren(list);
// 大阪人
list = new ArrayList();
list.add(new People("奈奈子"));
list.add(new People("菜菜子"));
list.add(new People("新垣结衣"));
osaka.setChildren(list);
// 关联城市与国家
// 中国
ArrayList citys = new ArrayList();
citys.add(beijing);
citys.add(shanghai);
citys.add(shenzhen);
cn.setChildren(citys);
// 美国
citys = new ArrayList();
citys.add(newyork);
citys.add(la);
us.setChildren(citys);
// 日本
citys = new ArrayList();
citys.add(tokyo);
citys.add(osaka);
jp.setChildren(citys);
// 国家列表
ArrayList countrys = new ArrayList();
countrys.add(cn);
countrys.add(us);
countrys.add(jp);
return countrys;
}
}

TreeLabelProvider.java

package model;

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

public class TreeLabelProvider implements ILabelProvider {
public String getText(Object element) {
Itree node = (Itree) element;
return node.getName();
}

@Override
public void addListener(ILabelProviderListener arg0) {
// TODO Auto-generated method stub

}

@Override
public void dispose() {
// TODO Auto-generated method stub

}

@Override
public boolean isLabelProperty(Object arg0, String arg1) {
// TODO Auto-generated method stub
return false;
}

@Override
public void removeListener(ILabelProviderListener arg0) {
// TODO Auto-generated method stub

}

public Image getImage(Object element) {
return null;
}
}

TreeContentProvider.java

package model;

import java.util.List;

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

public class TreeContentProvider implements IStructuredContentProvider,
ITreeContentProvider {
public Object[] getElements(Object inputElement) {
if (inputElement instanceof List) {
List input = (List) inputElement;
return input.toArray();
}
return new Object[0];
}

public Object[] getChildren(Object parentElement) {
Itree node = (Itree) parentElement;
List list = node.getChildren();
if (list == null) {
return new Object[0];
}
return list.toArray();
}

public boolean hasChildren(Object element) {
Itree node = (Itree) element;
List list = node.getChildren();
return !(list == null || list.isEmpty());
}

// 以下三个函数根据需要填充
public Object getParent(Object element) {
return null;
}

public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}

public void dispose() {
}
}

TestTreeViewer.java 程序入口类

package model;

import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;

public class TestTreeViewer {
private static Tree tree;

public static void main(String[] args) {
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application");
//
final ContainerCheckedTreeViewer treeViewer = new ContainerCheckedTreeViewer(shell, SWT.BORDER
| SWT.H_SCROLL);
tree = treeViewer.getTree();
tree.setBounds(83, 75, 264, 185);

treeViewer.setLabelProvider(new TreeLabelProvider());
treeViewer.setContentProvider(new TreeContentProvider());
List data = Factory.createTree();
treeViewer.setInput(data);

//获取要设置为选中状态的项,这里是中间的节点,不可以。
//Object[] item = new Object[]{((Itree)data.get(0)).getChildren().get(0)};
//设置为选中状态
//treeViewer.setCheckedElements(item);

//如果是根节点就可以
treeViewer.setCheckedElements(new Object[]{data.get(0)});

shell.open();
shell.setLayout(new FillLayout());
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}


要用到的jar包:org.eclipse.jface.jar,org.eclipse.swt.win32.win32.x86.jar
org.eclipse.ui.workbench.jar,org.eclipse.equinox.common.jar
org.eclipse.core.commands.jar,org.eclipse.core.runtime.jar,org.eclipse.ui.forms.jar
网络科技 2010-08-21
  • 打赏
  • 举报
回复
这个不是很清楚,楼主可以把关键代码贴出来给高人查看下那里出问题了

62,615

社区成员

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

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