首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

15.2  TreeViewer组件

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

15.2.1  TreeViewer构建步骤

TreeViewer中主要通过内容提供器(ITreeContentProvider)和标签提供器(ILabelProvider)组织树节点的内容和显示的信息。TreeViewer的构建步骤如下。

(1)创建TreeViewer对象,例如“TreeViewer tv = new TreeViewer(composite);”。

(2)设定内容管理器,例如“tv.setContentProvider(new FileTreeContentProvider());”。

(3)设定标签提供器,例如“tv.setLabelProvider(new FileTreeLabelProvider());”。

(4)设定TreeViewer的输入数据,例如“tv.setInput("root");”(用户可以通过输入数据构建树)。

15.2.2  内容提供器(ITreeContentProvider)

TreeViewer的内容提供器(ITreeContentProvider)构建树中比较复杂的部分,它为树的显示提供了内容,内容提供器要实现的方法如下。

(1)getElements。

此函数定义为“public Object[] getElements(Object inputElement);”,当程序开始构建树时,首先调用getElements返回一个对象的数组,此数组对象表示当前树的根节点,inputElement参数为TreeViewer的输入(setInput的输入数据)。

(2)hasChildren。

此函数定义为“public boolean hasChildren(Object element);”,当TreeViewer显示一个节点后,会调用hasChildren函数判断当前节点是否有子节点,如果有子节点则显示“+”,element参数为要判断是否有子节点的节点。

(3)getChildren。

此函数定义为“public Object[] getChildren(Object parentElement);”,当用户选择节点打开子节点时,会调用getChildren函数返回下一层子节点,parentElement参数为选择的节点。

(4)getParent。

此函数定义为“public Object getParent(Object element);”,可以通过此方法返回element的父节点。

(5)inputChanged。

此函数定义为“public void inputChanged(Viewer viewer, Object oldInput, Object newInput);”,当输入改变时调用此方法。

(6)dispose。

此函数定义为“public void dispose();”,当树销毁时被调用。

其中,getElements、hasChildren和getChildren是常用的方法,用户通过重写这几种方法构建一棵树,过程如下:通过getElements方法得到根,再通过hasChildren判断根下是否有子节点,如果有子节点,可以通过getChildren得到所有的子节点。如例程15-2为ITreeContentProvider接口的一个简单实现。

例程15-2  FileTreeContentProvider.java

class FileTreeContentProvider implements ITreeContentProvider {

    

     public Object[] getChildren(Object arg0) {

         //返回树的下一级节点

         return ((File) arg0).listFiles();

     }

     public Object getParent(Object arg0) {

         //返回树的上一级节点 

         return ((File) arg0).getParentFile();

     }

    

     public boolean hasChildren(Object arg0) {

         Object[] obj = getChildren(arg0);

         //判断树是否有下一级节点,true为在节点显示"+"信息

         return obj == null ? false : obj.length > 0;

     }

    

     public Object[] getElements(Object arg0) {

         //打印出树的输入信息,通常用户可以通过输入信息构建树

         System.out.println(arg0);

         // File.listRoots()作为树的根节点

         return File.listRoots();

     }

上例内容提供器通过文件系统获得树的输入内容,从而使用户构造的树能显示磁盘文件的树结构。

15.2.3  标签提供器(ILabelProvider)

在TreeViewer中,通过标签提供器(ILabelProvider)来显示节点的相关信息,包括显示内容和图标。

ILabelProvider主要实现getImage和getText函数。当TreeViewer得到一个节点后会通过getText得到此节点的显示文本,通过getImage方法得到节点的显示图标,代码如例程15-3所示。

例程15-3  ViewLabelProvider.java

class ViewLabelProvider extends ILabelProvider{

         public String getText(Object obj) {

              return obj.toString();

         }

         public Image getImage(Object obj) {

              String imageKey = ISharedImages.IMG_OBJ_ELEMENT;

              if (obj instanceof TreeParent)

                 imageKey = ISharedImages.IMG_OBJ_FOLDER;

              return PlatformUI.getWorkbench().getSharedImages().

getImage(imageKey);

         }

     }

15.2.4  TreeViewer实例

在TreeViewer实例中,一般还要定义树节点的结构。本例中的File对象就能够表示节点的父子关系(在视图扩展点的实现一章,笔者定义了一个树节点,有兴趣的读者可以在此章找到树节点的定义),代码如例程15-4所示。

例程15-4  FileBrowserTreeViewer.java

public class FileBrowserTreeViewer extends ApplicationWindow {

     public FileBrowserTreeViewer() {

         super(null);

     }

     public void run() {

         setBlockOnOpen(true);

         open();

         Display.getCurrent().dispose();

     }

     protected void configureShell(Shell shell) {

         super.configureShell(shell);

         shell.setText("File Tree");

         shell.setSize(400, 400);

     }

     protected Control createContents(Composite parent) {

         Composite composite = new Composite(parent, SWT.NONE);

         // 父容器分一列显示

         composite.setLayout(new GridLayout(1, false));

         Button preserveCase = new Button(composite, SWT.CHECK);

         preserveCase.setText("&Preserve case");

         final TreeViewer tv = new TreeViewer(composite);

         // 让树组件两端对齐

         tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));

         // 添加内容管理器

         tv.setContentProvider(new FileTreeContentProvider());

         // 添加标签管理器

         tv.setLabelProvider(new FileTreeLabelProvider());

         // 设置TreeViewer的输入

         tv.setInput("root"); // pass a non-null that will be ignored

         preserveCase.addSelectionListener(new SelectionAdapter() {

              public void widgetSelected(SelectionEvent event) {

                   boolean preserveCase =((Button)event.widget).getSelection();

                   FileTreeLabelProvider ftlp = (FileTreeLabelProvider) tv

                            .getLabelProvider();

                   ftlp.setPreserveCase(preserveCase);

              }

         });

         return composite;

     }

    

     public static void main(String[] args) {

         new FileBrowserTreeViewer().run();

     }

}

class FileTreeContentProvider implements ITreeContentProvider {

    

     public Object[] getChildren(Object arg0) {

         //返回树的下一级节点

         return ((File) arg0).listFiles();

     }

     public Object getParent(Object arg0) {

        

         //返回树的上一级节点 

         return ((File) arg0).getParentFile();

     }

    

     public boolean hasChildren(Object arg0) {

         Object[] obj = getChildren(arg0);

         //判断树是否有下一级节点,true为在节点显示"+"信息

         return obj == null ? false : obj.length > 0;

     }

    

     public Object[] getElements(Object arg0) {

        

         //打印出树的输入信息,通常用户可以通过输入信息构建树

         System.out.println(arg0);

         // File.listRoots()作为树的根节点

         return File.listRoots();

     }

    

     public void dispose() {

        

     }

     public void inputChanged(Viewer arg0, Object arg1, Object arg2) {

     }

}

class FileTreeLabelProvider implements ILabelProvider {

     private List listeners;

     private Image file;

     private Image dir;

     boolean preserveCase;

     public FileTreeLabelProvider() {

         listeners = new ArrayList();

         try {

              //添加文件和目录的图标

              file= new Image(null, new FileInputStream("icons/file.gif"));

              dir= new Image(null, new FileInputStream("icons/directory.gif"));

         } catch (FileNotFoundException e) {

             

         }

     }

    

     public void setPreserveCase(boolean preserveCase) {

         this.preserveCase = preserveCase;

         //触发事件,重新得到显示标签

         LabelProviderChangedEvent event = new LabelProviderChangedEvent(this);

         for (int i = 0, n = listeners.size(); i < n; i++) {

              ILabelProviderListener ilpl = (ILabelProviderListener) listeners

                       .get(i);

              ilpl.labelProviderChanged(event);

         }

     }

    

     public Image getImage(Object arg0) {

         //返回目录或文件的图标

         return ((File) arg0).isDirectory() ? dir : file;

     }

     public String getText(Object arg0) {

         String text = ((File) arg0).getName();

         if (text.length() == 0) {

              text = ((File) arg0).getPath();

         }

         //返回目录或文件的文件名

         return preserveCase ? text : text.toUpperCase();

     }

     public void addListener(ILabelProviderListener arg0) {

         //添加监听器

         listeners.add(arg0);

     }

     public void dispose() {

         if (dir != null)

              dir.dispose();

         if (file != null)

              file.dispose();

     }

     public boolean isLabelProperty(Object arg0, String arg1) {

         return false;

     }

    

     public void removeListener(ILabelProviderListener arg0) {

         //删除监听器

         listeners.remove(arg0);

     }

}

以上代码中,在主窗口上添加了TreeViewer组件,在树中显示当前磁盘和文件结构。另外可以通过“Preserve case”复选按钮选择是为原有显示文本还是全部大写显示文本,程序运行效果如图15-2所示。

图15-2  TreeViewer组件

TreeViewer的功能比较强大,在复杂的应用中可以用它代替SWT的Tree组件,实现树的完美展现。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论