用ContainerCheckedTreeViewer构建一颗带复选框的树之后,要根据用户上次的设置保持初始选中状态,比如:如果用户上次选择了中国,则中国下面所有子节点前面的复选框都为选中状态,如果用户只选择了北京,则只有中国和北京下面的子节点为选中状态,现在有一个问题,就是只能设置根节点的选中状态,即如果用户上次选择了中国,则可以在初始化树的时候设置中国及以下的节点为选中状态;如果用户只选择了北京,则没有办法只设置中国、北京及以下的节点为选中状态。有遇到过这个问题的兄弟请指导一下小弟,不慎感激!中国
   --北京
      --中关村
      --三元桥
   --上海
      --浦东
   --广州
      --天河
      --白云
美国
   --纽约
      --曼哈顿
   --休斯顿
 

解决方案 »

  1.   

    数据类:Itree.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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
      

  2.   

    也遇到这个问题,苦于没人给回答,还好后来解决了。。
    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); }
    }