SWT Tree

 SWT带有一组类用来帮助构建Tree界面。其中主要的类有Tree和TreeItem两个类,Tree类表示树的主干,其他项目将会添加到其上,TreeItem代表树上的某个项目(分枝)。

1. 创建Tree

要创建tree的界面,必须创建出Tree的对象并将它加入到Shell或者Composite上:

  Tree t=new Tree(s,SWT.SINGLE|SWT.BORDER);
除了SWT.BORDER外,Tree还支持三种额外的样式:SWT.SINGLE、SWT.MULTI、SWT.CHECK.

2.增加树节点

tree的项目是由TreeItem的对象来表示的,必须对每个想要加到tree上的项目创建出TreeItem对象。

要直接将项目加到tree的主干上,需传入已经创建的Tree对象的引用给TreeItem的构造函数,并传入样式与项目想要出现的位置信息:
 
TreeItem child1=new TreeItem(t,SWT.NONE,0);
child1.setText("1");
TreeItem child2=new TreeItem(t,SWT.NONE,1);
child1.setText("2");
TreeItem child3=new TreeItem(t,SWT.NONE,2);
child1.setText("3");

要创建其他项目的子项目,传递对作为parent项目的TreeItem的引用、样式与你希望子项目出现的位置给TreeItem的构造函数:

TreeItem child2a=new TreeItem(child2,SWT.NONE,0);
child2a.setText("2A");
TreeItem child2b=new TreeItem(child2,SWT.NONE,0);
child2b.setText("2B");

3.创建完整的Tree范例:

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.TreeEvent;
import org.eclipse.swt.events.TreeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;


public class TreeShell {
 Display d;
 Shell s;
 public TreeShell(){
  d=new Display();
  s=new Shell(d);
  s.setSize(250, 200);
  s.setText("Tree example");
  s.setLayout(new FillLayout());
  //创建具有单选和边框的Tree
  Tree t=new Tree(s,SWT.SINGLE|SWT.BORDER);
  //创建主干项目1、2和3
  TreeItem child1=new TreeItem(t,SWT.NONE,0);
  child1.setText("1");
  child1.setImage(new Image(d,"C://100//Fold1.ico"));
  TreeItem child2=new TreeItem(t,SWT.NONE,1);
  child2.setText("2");
  child2.setImage(new Image(d,"C://100//Fold1.ico"));
  //创建子项目的子项目2A和2B
  TreeItem child2a=new TreeItem(child2,SWT.NONE,0);
  child2a.setText("2A");
  child2a.setImage(new Image(d,"C://100//Fold1.ico"));
  TreeItem child2b=new TreeItem(child2,SWT.NONE,1);
  child2b.setText("2B");
  child2b.setImage(new Image(d,"C://100//Fold1.ico"));
  TreeItem child3=new TreeItem(t,SWT.NONE,2);
  child3.setText("3");
  child3.setImage(new Image(d,"C://100//Fold1.ico"));
  t.addTreeListener(new TreeListener(){
    //图像变成被合拢对象时的样子
   public void treeCollapsed(TreeEvent e) {
    TreeItem ti=(TreeItem)e.item;
    ti.setImage(new Image(d,"C://100//Fold1.ico"));
   }
                        //图像变成被展开对象所需的样子
   public void treeExpanded(TreeEvent e) {
    TreeItem ti=(TreeItem)e.item;
    ti.setImage(new Image(d,"C://100//Fold2.ico"));
   }
  });
  s.open();
  while(!s.isDisposed())
   if(!d.readAndDispatch())
    d.sleep();
  d.dispose();
 }
 public static void main(String args[]){
  new TreeShell();
 }
}

这个范例展示了创建Tree对象时的过程。不管有多复杂有多少层次,Tree的创建只是重复上述过程代码而已。

4.并用图像与TreeItem

可以使用setImage()来将TreeItem与图像进行关联:

child1.setImage(new Image(d,"C://icons//folder.gif"));

在展开节点时改变图像,需要一个机制来判断项目的状态。SWT提供特别为这些事件所设计的listener类型------TreeListener。以下这段程序可以被用在任何的tree上,只要将已经载入的图像文件替换就可以了。

t.addTreeListener(new TreeListener(){
                        //图像变成被合拢对象时的样子
   public void treeCollapsed(TreeEvent e) {
    TreeItem ti=(TreeItem)e.item;
    ti.setImage(new Image(d,"C://100//Fold1.ico"));
   }
                        //图像变成被展开对象所需的样子
   public void treeExpanded(TreeEvent e) {
    TreeItem ti=(TreeItem)e.item;
    ti.setImage(new Image(d,"C://100//Fold2.ico"));
   }
  });

5. 组合Tree与其他Widget
Windows的资源管理器通过结合Tree与List结构来完成的。下面我们构建一个简单的资源管理器。
在SWT中使用FillLayout加上Tree与List来构建相同类型的界面。
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;


public class TreeShell {
 Display d;
 Shell s;
 public TreeShell(){
  d=new Display();
  s=new Shell(d);
  s.setSize(250, 200);
  s.setText("Tree example");
                //设置tree和list各占Shell的50%
  s.setLayout(new FillLayout(SWT.HORIZONTAL));
  //创建具有单选和边框的Tree
  Tree t=new Tree(s,SWT.SINGLE|SWT.BORDER);
  //创建主干项目1、2和3
  TreeItem child1=new TreeItem(t,SWT.NONE,0);
  child1.setText("1");
  child1.setImage(new Image(d,"C://100//Fold1.ico"));
  TreeItem child2=new TreeItem(t,SWT.NONE,1);
  child2.setText("2");
  child2.setImage(new Image(d,"C://100//Fold1.ico"));
  //创建子项目的子项目2A和2B
  TreeItem child2a=new TreeItem(child2,SWT.NONE,0);
  child2a.setText("2A");
  child2a.setImage(new Image(d,"C://100//Fold1.ico"));
  TreeItem child2b=new TreeItem(child2,SWT.NONE,1);
  child2b.setText("2B");
  child2b.setImage(new Image(d,"C://100//Fold1.ico"));
  TreeItem child3=new TreeItem(t,SWT.NONE,2);
  child3.setText("3");
  child3.setImage(new Image(d,"C://100//Fold1.ico"));
  final List l=new List(s,SWT.BORDER|SWT.SINGLE);
  t.addTreeListener(new TreeListener(){
    //图像变成被合拢对象时的样子
   public void treeCollapsed(TreeEvent e) {
    TreeItem ti=(TreeItem)e.item;
    ti.setImage(new Image(d,"C://100//Fold1.ico"));
   }
           //图像变成被展开对象所需的样子
   public void treeExpanded(TreeEvent e) {
    TreeItem ti=(TreeItem)e.item;
    ti.setImage(new Image(d,"C://100//Fold2.ico"));
   }
  });
  t.addSelectionListener(new SelectionAdapter(){
   public void widgetSelected(SelectionEvent e){
    TreeItem ti=(TreeItem)e.item;
    populateList(ti.getText());
   }
            //处理用户选取节点的事件,在具体应用中,可以通过数据库选择项目,此处只是简单的例子。
   private void populateList(String text) {
    if(text.equals("1"))
    {
     l.removeAll();
     l.add("File1");
     l.add("File2");
    }
    if(text.equals("2"))
    {
     l.removeAll();
    }
    if(text.equals("2A"))
    {
     l.removeAll();
     l.add("File3");
     l.add("File4");
    }
    if(text.equals("2B"))
    {
     l.removeAll();
     l.add("File5");
     l.add("File6");
    }
    if(text.equals("3"))
    {
     l.removeAll();
     l.add("File7");
     l.add("File8");
    }
    
   }
  });
  s.open();
  while(!s.isDisposed())
   if(!d.readAndDispatch())
    d.sleep();
  d.dispose();
 }
 public static void main(String args[]){
  new TreeShell();
 }
}

6. 运用其它的Tree样式
SWT.MULTI创建出可以让用户作出多重选取的tree。SWT.CHECK样式的Tree会产生checkbox的Tree。如果使用了SWT.CHECK的样式,就需要判断哪些项目被选取了。通过调用TreeItem的getChecked()来判断某个项目是否被checked。下面的程序在循环中判断每个TreeItem的状态:
TreeItem[] tia=t.getItems();
  for(int i=0;i<tia.length;i++){
   if(tia[i].getChecked()){
    System.out.print("Checked");
   }
  TreeItem []child=tia[i].getItems();
  for(int n=0;n<child.length;n++)
   if(child[n].getChecked())
    System.out.print("Checked");
    }

以上的代码只能用在仅有一层子项目的tree上。多层的tree需要循环运算来处理。

SWT.CHECK样式的Tree对象在你需要让用户对Tree作出多重选取但又不想要SWT.MULTI模式的额外成本的时候是合适的(但若是要使用选取出的TreeItem来采取某些像是产生list内容这样的动作时则不适用)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值