Liny_@NotePad

沉迷ACG中

JFace TreeViewer Demo

YOYO posted @ 2009年7月20日 17:49 in 【Java SE】 with tags JFace TreeViewer , 6800 阅读

样例:

这是一个三级Tree,因此我们先定义三级对象,它们应该都继承于同一个接口,

【ITreeEntity】

  1. package demo.treeviewer;
  2.  
  3. import java.util.List;
  4.  
  5. /**
  6. * 树节点的接口
  7. * @author YOYO
  8. *
  9. */
  10. public interface ITreeEntry {
  11.        
  12.         //      设置与得到树节点的名称
  13.         public String getName();
  14.         public void setName(String name);
  15.        
  16.         //      设置与得到子结点集合
  17.         public void setChildren(List children);
  18.         public List getChildren();
  19.  
  20. }

【PeopleEntity】

  1. package demo.treeviewer;
  2.  
  3. import java.util.Date;
  4. import java.util.List;
  5.  
  6. /**
  7. * 本类包含五个不同数据类型的变量,分别对应数据库中的五个字段。
  8. *
  9. * @author YOYO
  10. *
  11. */
  12. public class PeopleEntity implements ITreeEntry {
  13.        
  14.         private Long id;
  15.         private String name;
  16.         private boolean sex;
  17.         private int age;
  18.         private Date createDate;
  19.        
  20.         public PeopleEntity(){}
  21.         public PeopleEntity(String name) { this.name = name; }
  22.        
  23.         public Long getId() {
  24.                 return id;
  25.         }
  26.         public void setId(Long id) {
  27.                 this.id = id;
  28.         }
  29.         public String getName() {
  30.                 return name;
  31.         }
  32.         public void setName(String name) {
  33.                 this.name = name;
  34.         }
  35.         public boolean isSex() {
  36.                 return sex;
  37.         }
  38.         public void setSex(boolean sex) {
  39.                 this.sex = sex;
  40.         }
  41.         public int getAge() {
  42.                 return age;
  43.         }
  44.         public void setAge(int age) {
  45.                 this.age = age;
  46.         }
  47.         public Date getCreateDate() {
  48.                 return createDate;
  49.         }
  50.         public void setCreateDate(Date createDate) {
  51.                 this.createDate = createDate;
  52.         }
  53.         public List getChildren() {
  54.                 return null;
  55.         }
  56.         public void setChildren(List children) {               
  57.         }
  58.  
  59. }

【CityEntity】

  1. package demo.treeviewer;
  2.  
  3. import java.util.List;
  4.  
  5. /**
  6. * 城市的实体类
  7. * @author YOYO
  8. *
  9. */
  10. public class CityEntity implements ITreeEntry {
  11.        
  12.         private Long id;
  13.        
  14.         private String name;
  15.        
  16.         private List peoples;
  17.  
  18.         public CityEntity() {
  19.                 super();
  20.         }
  21.  
  22.         public CityEntity(String name) {
  23.                 super();
  24.                 this.name = name;
  25.         }
  26.  
  27.         public Long getId() {
  28.                 return id;
  29.         }
  30.  
  31.         public void setId(Long id) {
  32.                 this.id = id;
  33.         }
  34.  
  35.         public String getName() {
  36.                 return name;
  37.         }
  38.  
  39.         public void setName(String name) {
  40.                 this.name = name;
  41.         }
  42.  
  43.         public List getPeoples() {
  44.                 return peoples;
  45.         }
  46.  
  47.         public void setPeoples(List peoples) {
  48.                 this.peoples = peoples;
  49.         }
  50.  
  51.         public List getChildren() {
  52.                 return this.getPeoples();
  53.         }
  54.  
  55.         public void setChildren(List children) {
  56.                 this.setPeoples(children);
  57.         }
  58.  
  59. }

【CountryEntity】

  1. package demo.treeviewer;
  2.  
  3. import java.util.List;
  4.  
  5. /**
  6. * 国家的实体类
  7. * @author YOYO
  8. *
  9. */
  10. public class CountryEntity implements ITreeEntry {
  11.  
  12.         private Long id;
  13.         private String name;
  14.         private List cities;
  15.         public CountryEntity() {
  16.                 super();
  17.         }
  18.         public CountryEntity(String name) {
  19.                 super();
  20.                 this.name = name;
  21.         }
  22.         public Long getId() {
  23.                 return id;
  24.         }
  25.         public void setId(Long id) {
  26.                 this.id = id;
  27.         }
  28.         public String getName() {
  29.                 return name;
  30.         }
  31.         public void setName(String name) {
  32.                 this.name = name;
  33.         }
  34.         public List getCities() {
  35.                 return cities;
  36.         }
  37.         public void setCities(List cities) {
  38.                 this.cities = cities;
  39.         }
  40.         public List getChildren() {
  41.                 return this.getCities();
  42.         }
  43.         public void setChildren(List children) {
  44.                 this.setCities(children);
  45.         }
  46.        
  47. }

TreeViewer的数据是由List带入的,因此我们创建一个类用来生成数据。(Country本来应该放国家,我这里放了“省内”和“省外”,囧)

  1. package demo.treeviewer;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. public class DataFactory {
  6.        
  7.         public static Object createTreeData() {
  8.                 PeopleEntity p1 = new PeopleEntity("Yahreso Lin");
  9.                 PeopleEntity p2 = new PeopleEntity("Queeny Lee");
  10.                 PeopleEntity p3 = new PeopleEntity("Skittles");
  11.                 PeopleEntity p4 = new PeopleEntity("Cyin");
  12.                 PeopleEntity p5 = new PeopleEntity("Lienxq");
  13.                 PeopleEntity p6 = new PeopleEntity("Mini Yang");
  14.                 PeopleEntity p7 = new PeopleEntity("ChenST");
  15.                 PeopleEntity p8 = new PeopleEntity("ZhengC");
  16.                 PeopleEntity p9 = new PeopleEntity("BlackBeetle");
  17.                
  18.                 CityEntity city1 = new CityEntity("龙岩");
  19.                 CityEntity city2 = new CityEntity("郑州");
  20.                 CityEntity city3 = new CityEntity("福州");
  21.                 CityEntity city4 = new CityEntity("厦门");
  22.                 CityEntity city5 = new CityEntity("天津");
  23.                
  24.                 CountryEntity c1 = new CountryEntity("省内");
  25.                 CountryEntity c2 = new CountryEntity("省外");
  26.                
  27.                 {
  28.                         ArrayList list = new ArrayList();
  29.                         list.add(p1);
  30.                         list.add(p2);
  31.                         city1.setChildren(list);
  32.                 }
  33.                 {
  34.                         ArrayList list = new ArrayList();
  35.                         list.add(p3);
  36.                         city2.setChildren(list);
  37.                 }
  38.                 {
  39.                         ArrayList list = new ArrayList();
  40.                         list.add(p4);
  41.                         list.add(p7);
  42.                         list.add(p8);
  43.                         city3.setChildren(list);
  44.                 }
  45.                 {
  46.                         ArrayList list = new ArrayList();
  47.                         list.add(p5);
  48.                         list.add(p9);
  49.                         city4.setChildren(list);
  50.                 }
  51.                 {
  52.                         ArrayList list = new ArrayList();
  53.                         list.add(p6);
  54.                         city5.setChildren(list);
  55.                 }
  56.                
  57.  
  58.                 {
  59.                         ArrayList list = new ArrayList();
  60.                         list.add(city1);
  61.                         list.add(city3);
  62.                         list.add(city4);
  63.                         c1.setChildren(list);
  64.                 }
  65.                 {
  66.                         ArrayList list = new ArrayList();
  67.                         list.add(city2);
  68.                         list.add(city5);
  69.                         c2.setChildren(list);
  70.                 }
  71.  
  72.                 {
  73.                         ArrayList list = new ArrayList();
  74.                         list.add(c1);
  75.                         list.add(c2);
  76.                         return list;
  77.                 }
  78.         }
  79.  
  80. }

然后一个TreeViewer还需要一个ContentProvider和一个LabelProvider,

【TreeViewContentProvider】

  1. package demo.treeviewer;
  2.  
  3. import java.util.List;
  4.  
  5. import org.eclipse.jface.viewers.ITreeContentProvider;
  6. import org.eclipse.jface.viewers.Viewer;
  7.  
  8. /**
  9. * 内容器:由它决定哪些对象记录应该输出在TreeViewer里显示
  10. * @author YOYO
  11. *
  12. */
  13. public class TreeViewContentProvider implements ITreeContentProvider {
  14.  
  15.         /**
  16.          * 由这种方法决定父节点应该显示哪些子结点
  17.          */
  18.         public Object[] getChildren(Object parentElement) {
  19.                 ITreeEntry entry = (ITreeEntry) parentElement;
  20.                 List list = entry.getChildren();
  21.                 if( list == null || list.isEmpty() ) {
  22.                         return new Object[0];
  23.                 }else{
  24.                         return list.toArray();
  25.                 }
  26.         }
  27.  
  28.         public Object getParent(Object element) {
  29.                 return null;
  30.         }
  31.  
  32.         /**
  33.          * 判断某节点是否有子结点
  34.          */
  35.         public boolean hasChildren(Object element) {
  36.                 ITreeEntry entry = (ITreeEntry) element;
  37.                 List list = entry.getChildren();
  38.                 if(list==null || list.isEmpty()) {
  39.                         return false;
  40.                 }else{
  41.                         return true;
  42.                 }
  43.         }
  44.  
  45.         /**
  46.          * 由这种方法决定树的一级显示哪些对象
  47.          */
  48.         public Object[] getElements(Object inputElement) {
  49.                 if(inputElement instanceof List) {
  50.                         List list = (List) inputElement;
  51.                         return list.toArray();
  52.                 }else{
  53.                         return new Object[0];
  54.                 }
  55.         }
  56.  
  57.         public void dispose() {
  58.  
  59.         }
  60.  
  61.         public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
  62.         }
  63.  
  64. }

【TreeViewLabelProvider】

  1. package demo.treeviewer;
  2.  
  3. import org.eclipse.jface.viewers.ILabelProvider;
  4. import org.eclipse.jface.viewers.ILabelProviderListener;
  5. import org.eclipse.swt.graphics.Image;
  6.  
  7. /**
  8. * 标签提供器:控制记录在树中显示的文字和图像等
  9. *
  10. * @author YOYO
  11. *
  12. */
  13. public class TreeViewerLableProvider implements ILabelProvider {
  14.  
  15.         /**
  16.          * 记录显示的图像,可以返回null值
  17.          */
  18.         public Image getImage(Object element) {
  19.                 return null;
  20.         }
  21.  
  22.         /**
  23.          * 记录显示的文字,不能返回null
  24.          */
  25.         public String getText(Object element) {
  26.                 ITreeEntry entry = (ITreeEntry) element;
  27.                 return entry.getName();
  28.         }
  29.  
  30.         public void addListener(ILabelProviderListener listener) {
  31.         }
  32.  
  33.         public void dispose() {
  34.         }
  35.  
  36.         public boolean isLabelProperty(Object element, String property) {
  37.                 return false;
  38.         }
  39.  
  40.         public void removeListener(ILabelProviderListener listener) {
  41.         }
  42.  
  43. }

 

这样就完成一个简单的TreeViewer了,代码如下:

【TreeViewer1】

  1. package demo.treeviewer;
  2.  
  3. import org.eclipse.jface.viewers.TreeViewer;
  4.  
  5. public class TreeViewer1 {
  6.        
  7.         public static void main(String[] args) {
  8.                 TreeViewer1 window = new TreeViewer1();
  9.                 window.open();
  10.         }
  11.        
  12.         public void open(){
  13.                 final Display display = new Display();
  14.                 final Shell shell = new Shell();
  15.                 shell.setSize(200, 300);
  16.                
  17.                 shell.setLayout(new FillLayout());
  18.                 Composite c = new Composite(shell, SWT.NONE);
  19.                 c.setLayout(new FillLayout());
  20.                 TreeViewer tv = new TreeViewer(c, SWT.BORDER);
  21.                 tv.setContentProvider(new TreeViewContentProvider());
  22.                 tv.setLabelProvider(new TreeViewerLableProvider());
  23.                
  24.                 Object inputObj = DataFactory.createTreeData();
  25.                 tv.setInput(inputObj);
  26.                
  27.                 shell.open();
  28.                 while(!shell.isDisposed()) {
  29.                         if(!display.readAndDispatch()) {
  30.                                 display.sleep();
  31.                         }
  32.                 }
  33.         }
  34.  
  35. }

但这只是个简单的显示TreeViewer的操作,如果要为它加上右键动作的话,我们需要做一下处理:

【MyActionGroup】

  1. package demo.treeviewer;
  2.  
  3. import org.eclipse.jface.action.Action;
  4.  
  5. public class MyActionGroup extends ActionGroup {
  6.        
  7.         private TreeViewer tv;
  8.        
  9.         public MyActionGroup(TreeViewer treeViewer) {
  10.                 this.tv = treeViewer;
  11.         }
  12.  
  13.         @Override
  14.         public void fillContextMenu(IMenuManager mgr) {
  15.                 MenuManager menuManager = (MenuManager) mgr;
  16.                 menuManager.add(new OpenAction());
  17.                 menuManager.add(new RefreshAction());
  18.  
  19.                 menuManager.add(new ExpandAction());
  20.                 menuManager.add(new CollapseAction());
  21.                 menuManager.add(new AddEntryAction());
  22.                 menuManager.add(new RemoveEntryAction());
  23.                 menuManager.add(new ModifyEntryAction());
  24.                
  25.                 Tree tree = tv.getTree();
  26.                 Menu menu = menuManager.createContextMenu(tree);
  27.                 tree.setMenu(menu);
  28.         }
  29.        
  30.         private class OpenAction extends Action {
  31.                 public OpenAction() {
  32.                         setText("打开");
  33.                 }
  34.                
  35.                 public void run() {
  36.                         IStructuredSelection selection = (IStructuredSelection) tv.getSelection();
  37.                         ITreeEntry obj = (ITreeEntry) (selection.getFirstElement());
  38.                         if(obj != null) {
  39.                                 MessageDialog.openInformation(null, null, obj.getName());
  40.                         }
  41.                 }
  42.         }
  43.        
  44.         private class RefreshAction extends Action {
  45.                 public RefreshAction() {
  46.                         setText("刷新");
  47.                 }
  48.                
  49.                 public void run() {
  50.                         tv.refresh();
  51.                 }
  52.         }
  53.        
  54.         /**
  55.          * 展开当前节点的Action类
  56.          * @author YOYO
  57.          *
  58.          */
  59.         private class ExpandAction extends Action {
  60.                 public ExpandAction() {
  61.                         setText("展开");
  62.                 }
  63.                
  64.                 public void run() {
  65.                         ITreeEntry obj = getSelTreeEntry();
  66.                         if(obj != null) {
  67.                                 tv.expandToLevel(obj, 1);       //     只展开一层,设置可以超过实际树的层数
  68.                         }
  69.                 }
  70.                
  71.         }
  72.        
  73.         /**
  74.          * 收缩当前节点的Action类
  75.          * @author YOYO
  76.          *
  77.          */
  78.         private class CollapseAction extends Action {
  79.                 public CollapseAction() {
  80.                         setText("收缩");
  81.                 }
  82.                
  83.                 public void run() {
  84.                         ITreeEntry obj = getSelTreeEntry();
  85.                         if(obj != null) {
  86.                                 tv.expandToLevel(obj, -1);      //    -1为将当前节点的所有子结点收缩
  87.                         }
  88.                 }
  89.         }
  90.        
  91.         /**
  92.          * 给当前节点添加一个子结点的Action类
  93.          * @author YOYO
  94.          *
  95.          */
  96.         private class AddEntryAction extends Action {
  97.                 public AddEntryAction() {
  98.                         setText("增加");
  99.                 }
  100.                
  101.                 public void run() {
  102.                         ITreeEntry obj = getSelTreeEntry();
  103.                         if(obj == null || obj instanceof PeopleEntity ) {
  104.                                 return;
  105.                         }
  106.                         InputDialog dialog = new InputDialog(null, "给当前节点增加一个子结点", "输入名称", "abc", null);
  107.                         if(dialog.open() == InputDialog.OK ) {
  108.                                 String entryName = dialog.getValue();
  109.                                
  110.                                 ITreeEntry newEntry = null;
  111.                                 if(obj instanceof CountryEntity) {
  112.                                         newEntry = new CityEntity(entryName);
  113.                                 }else if(obj instanceof CityEntity) {
  114.                                         newEntry = new PeopleEntity(entryName);
  115.                                 }
  116.                                
  117.                                 //      在增加子结点之前把父节点展开
  118.                                 if(!tv.getExpandedState(obj)) {
  119.                                         tv.expandToLevel(obj, 1);
  120.                                 }
  121.                                
  122.                                 tv.add(obj, newEntry);
  123.                         }
  124.                 }
  125.         }
  126.        
  127.         /**
  128.          * 删除节点的Action类
  129.          * @author YOYO
  130.          *
  131.          */
  132.         private class RemoveEntryAction extends Action {
  133.                 public RemoveEntryAction() {
  134.                         setText("删除");
  135.                 }
  136.                
  137.                 public void run() {
  138.                         ITreeEntry obj = getSelTreeEntry();
  139.                         if(obj == null) {
  140.                                 return;
  141.                         }
  142.                         tv.remove(obj);
  143.                 }
  144.         }
  145.  
  146.         /**
  147.          * 修改节点名称的Action类
  148.          * @author YOYO
  149.          *
  150.          */
  151.         private class ModifyEntryAction extends Action {
  152.                 public ModifyEntryAction() {
  153.                         setText("修改");
  154.                 }
  155.                
  156.                 public void run() {
  157.                         ITreeEntry obj = getSelTreeEntry();
  158.                         if(obj == null) {
  159.                                 return;
  160.                         }
  161.                         InputDialog dialog = new InputDialog(null, "修改节点", "输入新名称", obj.getName(), null);
  162.                         if(dialog.open() == InputDialog.OK ) {
  163.                                 String entryName = dialog.getValue();
  164.                                 obj.setName(entryName);
  165.                                 tv.refresh(obj);
  166.                         }
  167.                 }
  168.         }
  169.                
  170.         /**
  171.          * 自定义方法:取得当前选择的节点
  172.          * @return
  173.          */
  174.         private ITreeEntry getSelTreeEntry() {
  175.                 IStructuredSelection selection = (IStructuredSelection) tv.getSelection();
  176.                 ITreeEntry entry = (ITreeEntry) (selection.getFirstElement());
  177.                 return entry;
  178.         }
  179.        
  180. }

【TreeViewer2】修改原先的类,增加注入菜单的

  1. package demo.treeviewer;
  2.  
  3. import org.eclipse.jface.action.MenuManager;
  4.  
  5. public class TreeViewer2 {
  6.        
  7.         public static void main(String[] args) {
  8.                 TreeViewer2 window = new TreeViewer2();
  9.                 window.open();
  10.         }
  11.        
  12.         public void open(){
  13.                 final Display display = new Display();
  14.                 final Shell shell = new Shell();
  15.                 shell.setText("JFace TreeViewer Demo");
  16.                 shell.setSize(278, 300);
  17.                
  18.                 shell.setLayout(new FillLayout());
  19.                 Composite c = new Composite(shell, SWT.NONE);
  20.                 c.setLayout(new FillLayout());
  21.                 TreeViewer tv = new TreeViewer(c, SWT.BORDER);
  22.                 tv.setContentProvider(new TreeViewContentProvider());
  23.                 tv.setLabelProvider(new TreeViewerLableProvider());
  24.                
  25.                 /////////////START
  26.                 MyActionGroup actionGroup = new MyActionGroup(tv);
  27.                 actionGroup.fillContextMenu(new MenuManager());
  28.                 /////////////END
  29.                
  30.                 Object inputObj = DataFactory.createTreeData();
  31.                 tv.setInput(inputObj);
  32.                
  33.                 shell.open();
  34.                 while(!shell.isDisposed()) {
  35.                         if(!display.readAndDispatch()) {
  36.                                 display.sleep();
  37.                         }
  38.                 }
  39.         }
  40.  
  41. }
  • 无匹配
linda 说:
2010年7月27日 01:13

博主,你好!这个例子很好,可是我想知道在treeViewer树上进行修改怎么做啊,你这个程序不全吧!我很急,希望看到我的留言能给我联系好吗?谢谢!!

Head_small
YOYO 说:
2010年7月27日 22:42

这个应该是全的吧 = =。。已经发送邮件过去。。

小歪 说:
2020年7月30日 17:28

亲测有用!非常感谢,帮了我的大忙。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter