JFace TreeViewer组件

 JFace中提供了TreeViewer组件,用TreeViewer来表示树型结构对象的显示。 TreeViewer功能比较强,它能定义节点、节点的显示标签、响应事件和显示图标等信息。


b+NM0O Z$J8q2AyH0 TreeViewer构建步骤


3oT [D%j{0/0 TreeViewer中主要通过内容提供器(ITreeContentProvider)和标签提供器 (ILabelProvider)组织树节点的内容和显示的信息。TreeViewer的构建步骤如下。
F9pF3a.ro.f_0 1.  创建TreeViewer对象,例如“TreeViewer tv = new TreeViewer(composite);”。ITPUB个人空间t6Y Jt;`)[!B~
2.  设定内容管理 器,例如 “tv.setContentProvider(new FileTreeContentProvider());”。
u:}Q+qd3^`RP0 3.  设定标签提供器,例如“tv.setLabelProvider(new FileTreeLabelProvider());”。ITPUB个人空间5o)T!C-BY�n DL
4.  设定TreeViewer的输入数据,例如“tv.setInput("root");”(用户可以通过输入数据构建树)。


]ZQf"q0 TreeViewer内容提供器


f2z6aGN:CT!K0 TreeViewer的内容提供器 (ITreeContentProvider)构建树中比较复杂的部分,它为树的显示提供了内容,内容提供器要实现的方法如下。ITPUB个人空间!DJ-rm9B!I3p?
1.  getElementsITPUB个人空间U%w8N6^*{+Z M
此函数定义为“public Object[] getElements(Object inputElement);”,当程序开始构建树时,首先调用getElements返回一个对象的数组,此数组对象表示当前树的根节 点,inputElement参数为TreeViewer的输入(setInput的输入数据)。
1~.J*zG/x`0 2.  hasChildrenITPUB 个人空间'/.F*]5bEXS'cPQ$a|u
此函数定义为“public boolean hasChildren(Object element);”,当TreeViewer显示一个节点后,会调用hasChildren函数判断当前节点是否有子节点,如果有子节点则显示 “+”,element参数为要判断是否有子节点的节点。ITPUB个人空间!{ l!T8qOR:M0{|~P
3.  getChildrenITPUB个人空间;n Md;lIg9hD+]D
此函数定义为“public Object[] getChildren(Object parentElement);”,当用户选择节点打开子节点时,会调用getChildren函数返回下一层子节点,parentElement参数为 选择的节点。ITPUB个人空间2T4DdU+i+j
4.  getParent
d?/mHh NT}N0 此函数定义为“public Object getParent(Object element);”,可以通过此方法返回element的父节点。
HU7wQ#xa0 5.  inputChanged
#v6r#aDgb3ef0 此函 数定义为“public void inputChanged(Viewer viewer, Object oldInput, Object newInput);”,当输入改变时调用此方法。ITPUB个人空间5D j-o1l*~jx
6.  dispose
-j�XQA6l9p't0 此 函数定义为“public void dispose();”,当树销毁时被调用。ITPUB 个人空间9O5z8|kG(GIX4^B
其中,getElements、hasChildren和 getChildren是常用的方法,用户通过重写这几个方法构建一棵树,过程如下:通过getElements方法得到根,再通过 hasChildren判断根下是否有子节点,如果有子节点,可以通过getChildren得到所有的子节点。如例程1为 ITreeContentProvider接口的一个简单实现。ITPUB个人空间s C'[B q)g0SR,C-v
例程1  FileTreeContentProvider.java
Q#n1["Ac/r0 class FileTreeContentProvider implements ITreeContentProvider {ITPUB个人空 间,c-I.C+/(L7G!e4[)H?
 ITPUB个人空间 V#w#}7e-_:aP"h
 public Object[] getChildren(Object arg0) {ITPUB个人空间!Q8@a1G3L_(M
  //返回树的下一级节点ITPUB个人空间;ed*[/mb
  return ((File) arg0).listFiles();ITPUB个人空间 ^?MnX
 }

 public Object getParent(Object arg0) {ITPUB个人空间$y [.T1y,C%`OX%^
  //返回树的上一 级节点 
^ Qr7}-A/t!x0   return ((File) arg0).getParentFile();
1zW$u4e8e0  }
iN0Q%^n0  
!cfP.F3a1j!Ku2]0  public boolean hasChildren(Object arg0) {
v,Z5oo:~e7Q[0   Object[] bj = getChildren(arg0);

  //判断树是否有下一级节点,true为在节点显示"+"信息
.}&D%m*Z g [0   return bj == null ? false : obj.length > 0;
`l$w$_9R@0  }ITPUB个人空间Ah;|@!w/MD:y4Yp
 
sG0X;N;se f?_0  public Object[] getElements(Object arg0) {

  //打印出树的输入信息,通常用户可以通过输入信息构建树ITPUB个人空间+o;M} /;~iF_)X
  System.out.println(arg0);ITPUB个人空间TJ9NU0FW5[
  // File.listRoots()作为树的根节点ITPUB个人空间#x.M[5P M!h
  return File.listRoots();
[J2z(Mr0  }
fC{2Zx+T0 上例内容提供器通过文件系统获得树的输入内容,从而使用户构 造的树能显示磁盘文件的树结构。


1uq`6LT0 TreeViewer标签提供器

ITPUB个人空间8f1B![1b0xy)gn _R,~
在TreeViewer中,通过标签提供器(ILabelProvider)来显示节点的相关信息,包括显示内容和图 标。
IL^*}y*yQ0 ILabelProvider主 要实现getImage和getText函数。当TreeViewer得到一个节点后会通过getText得到此节点的显示文本,通过getImage方 法得到节点的显示图标,代码如例程2所示。
?0?w+f/?0e)J0 例 程2  ViewLabelProvider.java
(K&hf;B#O2E0 class ViewLabelProvider extends ILabelProvider{
Q&cV"B"C ?cj:f,e Lfh0ITPUB个人空间h]&/Ev'ZY3S z
  public String getText(Object obj) {
VnO(l�@}ko0    return obj.toString();ITPUB个人空间Z9Z&H6E/|K
  }ITPUB个人空间[jK-TO)Gf
  public Image getImage(Object obj) {ITPUB个人空间U�q[)kT v y
   String imageKey = ISharedImages.IMG_OBJ_ELEMENT;ITPUB个人空间sw^7Y K*QL
   if (obj instanceof TreeParent)
#YExd:@4M6B0       imageKey = ISharedImages.IMG_OBJ_FOLDER;ITPUB 个人空间n/IBBw&MH|&/M@
   return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);ITPUB个人空间�V5` SimX(I.|&@A9O
  }ITPUB个人空 间EN^ rO+k%dr n$v

h�G)g y;/M*T ?g0  }


)Q7|h;[0tuPd{ Q0 TreeViewer实例


8m�IG'g;UE^7D0 在TreeViewer实例中,一般还要定义树节点 的结构。本例中的File对象就能够表示节点的父子关系,代码如例程3所示。ITPUB个人 空间BW Yr s/UoEp K
例程3  FileBrowserTreeViewer.java

/**
(C U&ar a;d0  * 为了节省篇幅,把所有的import类注释了ITPUB个人空 间.qi XA)p1W
 * 读者可以通过ctrl+shift+o快捷键,自动引入所依赖的类
j*xpzI iVp0  * */ITPUB个人空间;sh z3vT*/8O0U
public class FileBrowserTreeViewer extends ApplicationWindow {ITPUB个人空间�? ~4}/W B-g H
 public FileBrowserTreeViewer() {
|2uu/|0   super(null);ITPUB个人空间:~-}!d0O:i {
 }

 public void run() {ITPUB 个人空间5U}H6[ B'JJ
  setBlockOnOpen(true);

  open();

  Display.getCurrent().dispose();
;`_y]2FKYrb0J�z0  }

 protected void configureShell(Shell shell) {ITPUB个人空 间#/$xH[Y%x.O m
  super.configureShell(shell);

  shell.setText("File Tree");ITPUB个人空间!j�I2k+kIw r
  shell.setSize(400, 400);ITPUB个人空间9M%j_^3`;_J4uqi+g&^
 }

 protected Control createContents(Composite parent) {
"xK&?MZ O2u0   Composite composite = new Composite(parent, SWT.NONE);ITPUB个人空间G&tl9k7X'/|/{4aj
  // 父容器分一列显示ITPUB个人空间 F ^)Q*N7y.jAeP,I&x J
  composite.setLayout(new GridLayout(1, false));

  Button preserveCase = new Button(composite, SWT.CHECK);ITPUB个人空间?2a `'_ yqJ"e?
  preserveCase.setText("&Preserve case");

  final TreeViewer tv = new TreeViewer(composite);
!i6Ds po;?9k0   // 让树组件两端对齐ITPUB 个人空间d-FZ/E [3` E Y
  tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));ITPUB个人空间PD XSi!@yG
  // 添加内容管理器
J:s Z,MB0   tv.setContentProvider(new FileTreeContentProvider());ITPUB个人空间 S&g ob(wJ$E2v
  // 添加标签管理器
wd9F]h.s0   tv.setLabelProvider(new FileTreeLabelProvider());ITPUB个人空间LUb+xKd
  // 设置treeviewer的输入
@ i%I2@ __0   tv.setInput("root"); // pass a non-null that will be ignored

  preserveCase.addSelectionListener(new SelectionAdapter() {
d1rEVQ8Y$V;N0    public void widgetSelected(SelectionEvent event) {
#u Sk;ZRpC{�X0     boolean preserveCase = ((Button) event.widget).getSelection();
dVI"n/L8t Z!x/t{0     FileTreeLabelProvider ftlp = (FileTreeLabelProvider) tvITPUB个人空间L]5|4yd-B'p Z
      .getLabelProvider();
-S B#E4w,ltV0     ftlp.setPreserveCase(preserveCase);
nrts-Y0    }ITPUB个人空间,],{s9O)nn)l{
  });
;~)Y,O2w-Hg0   return composite;ITPUB个人空间 ly4o~5]+tf%yo
 }
vqFj^cq0  ITPUB个人空间�t,_(W;Lt~
 public static void main(String[] args) {ITPUB个人空间b0?%X W+~hH8e
  new FileBrowserTreeViewer().run();ITPUB个人空间.x$g J!C s
 }ITPUB个人空间-/LO1}*L(]`
}

// 定义内容提供器ITPUB个人空间&K_[B`
class FileTreeContentProvider implements ITreeContentProvider {ITPUB个人空间!b4~i�g(P(Z
 ITPUB个人空间+D{gF#JREX8Ci
 public Object[] getChildren(Object arg0) {ITPUB个人空 间u cpE dN4a2{c
  //返回树的下一级节点
R1[J9CahEb Rq"[0   return ((File) arg0).listFiles();
)^u2K;B%h,Z0  }

 public Object getParent(Object arg0) {
S'V0` Q}O&CK0   ITPUB个人空间ni)RQ/9wSdmwOs
  // 返回树的上一级节点 ITPUB个人空间3` tYJ xs"X:I~
  return ((File) arg0).getParentFile();ITPUB个人空间 g2}Nmg
 }
/lWJ RhA[W/M0  
W8y6Z~4|a*Z J0  public boolean hasChildren(Object arg0) {ITPUB个人空 间eUbi `8|0pS6Z#`
  Object[] bj = getChildren(arg0);

  // 判断树是否有下一级节点,true为在节点显示"+"信息ITPUB个人空间H t h'm:e K yO.^&N
  return bj == null ? false : obj.length > 0;
[[a2S#f{0S X%q b0  }
L)r%F(BE~Kq4}�^"/0  
Q q-tn6|&I0  public Object[] getElements(Object arg0) {ITPUB个人空间3]m3wR&Y"Fo do ?
  
(zvj!R#L+o4CS0   //打印出树的输入信息,通常用户可以通过输入 信息构建树ITPUB个人空间 @r%i-h ^ B!HZb
  System.out.println(arg0);
y!sd$m*Y/!Y3Z'/f0   // File.listRoots()作为树的根节点ITPUB个人空间$me)Ln pqn
  return File.listRoots();
V C/S5m/o*P8J"_0  }
I FmzRw S0o0  ITPUB个人空间.xgtT^6X
 public void dispose() {ITPUB个人空间7VP+v7m4z*{!/u e
  
v8} zK+^l8?']t0  }

 public void inputChanged(Viewer arg0, Object arg1, Object arg2) {ITPUB个人空间1kh'Ti~ n
  
e H,wAg4U dg0  }
sw#Z&avg%ur3Ro0 }

// 定义标签提供器
x7Z-E_LRkhR*U0 class FileTreeLabelProvider implements ILabelProvider {ITPUB个人空间$W;_+[U?'v*f
 private List listeners;

 private Image file;

 private Image dir;

 boolean preserveCase;

 public FileTreeLabelProvider() {ITPUB个人空间nl#Ev x-v*a
  listeners = new ArrayList();

  try {ITPUB个人空间x%eR U U�g
   //添加文件和目录的图标ITPUB个人空间 ?$S0[ ~,s.^}0T
   file = new Image(null, new FileInputStream("icons/file.gif"));
)v)XSa&r#X0    dir = new Image(null, new FileInputStream("icons/directory.gif"));
;kq(Q7A4et/b$h{0   } catch (FileNotFoundException e) {
3w3/]6^?h)j0    ITPUB个人空间R(s^,W/`0}V!y)G
  }ITPUB个人空间~e8G(U(BQ
 }
!Kl$r"GW4_H0  ITPUB个人空间e@Bf"Y%]i-xY�l
 public void setPreserveCase(boolean preserveCase) {
@j2[WD#jMB t9{hM-L0   this.preserveCase = preserveCase;

  //触发事件,重新得到 显示标签ITPUB个人空间n:Os6fRLyC`
  LabelProviderChangedEvent event = new LabelProviderChangedEvent(this);ITPUB个人空间]u9|GpM2BT
  for (int i = 0, n = listeners.size(); i < n; i++) {
]b Z;w:w/xxH1j0    ILabelProviderListener ilpl = (ILabelProviderListener) listenersITPUB个人空 间$HT Go:T
     .get(i);
5S7G7x}7G5w N)GFc7B#n0    ilpl.labelProviderChanged(event);ITPUB个人空间,g1C{ne b
  }
B6MN|:~w0  }ITPUB个人空间 P#T�],O z_z^@
 ITPUB个人空间#J(]8D8O-c5w {l$i
 public Image getImage(Object arg0) {ITPUB个人空间 o0ei9/@;t
  //返回目录或文件的图标ITPUB个人 空间Wfi9gN%XC]X C A
  return ((File) arg0).isDirectory() ? dir : file;ITPUB个人空间4mW`8H?Se/8tR
 }

 public String getText(Object arg0) {ITPUB个人空间~$~ P;v;w6jA
  String text = ((File) arg0).getName();

  if (text.length() == 0) {ITPUB个人空间&s ?;z!B'c!By
   text = ((File) arg0).getPath();
T5dOh*]#Jo/b2v0   }

  //返回目录或文件的文 件名
;T;S%o�l;x{,@:`0   return preserveCase ? text : text.toUpperCase();
n4sk,[*OWy%o0  }

 public void addListener(ILabelProviderListener arg0) {ITPUB 个人空间Gd.s#Z)xD.{Q U o
  //添加监听器
%Dp4[4Ie0iy~ a0   listeners.add(arg0);
J-eP EZ0  }

 public void dispose() {
Z(E@2j6Up MTb0   if (dir != null)
7fn3C^"V,?m/M0    dir.dispose();ITPUB个人空间,q OlDs5pH
  if (file != null)ITPUB 个人空间U"Ap;sg3S'|*g�Fm
   file.dispose();
| MX&t _&/0L z9Km0  }

 public boolean isLabelProperty(Object arg0, String arg1) {
*z0?-meae T:q1`0   return false;ITPUB个人空间;~7D*d7OV:u3`4M A
 }ITPUB个人空间eT.g+gT8_5zn
 ITPUB个人空间.o} u-K A#HgU"b
 public void removeListener(ILabelProviderListener arg0) {ITPUB个人空间,@r8Q9]J/m3JM
  //删除监听器ITPUB个人空间IO(s,bj9I6n6dV
  listeners.remove(arg0);ITPUB个人空间{:r-N6hego W
 }
c%hm~9[&{ /'d0 }
0M9s*@ Zk^(a0 以上代码 中,在主窗口上添加了TreeViewer组件,在树中显示当前磁盘和文件结构。另外可以通过“Preserve case”复选按钮选择是为原有显示文本还是全部大写显示文本。

TreeViewer的功能比较强大,在复杂的应用可以用它代替SWT的Tree组件,实现树的完美展现。ITPUB个人空间X VaU1e&F|
上例中文件“icons/file.gif”和目录“icons/directory.gif”的 图片没有加入,读者可以加入相应的显示图片,图片的位置为相对于当前工程根目录的相对路径。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值