JFace TreeViewer组件

原文:http://blog.csdn.net/naughty610/article/details/5308263

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


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");”(用户可以通过输入数据构建树)。


TreeViewer内容提供器


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得到所有的子节点。如例程1为 ITreeContentProvider接口的一个简单实现。 
例程1  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[] bj = getChildren(arg0);

  //判断树是否有下一级节点,true为在节点显示"+"信息
  return bj == null ? false : obj.length > 0;
 } 
 
 public Object[] getElements(Object arg0) {

  //打印出树的输入信息,通常用户可以通过输入信息构建树 
  System.out.println(arg0); 
  // File.listRoots()作为树的根节点 
  return File.listRoots();
 }
上例内容提供器通过文件系统获得树的输入内容,从而使用户构 造的树能显示磁盘文件的树结构。


TreeViewer标签提供器


在TreeViewer中,通过标签提供器(ILabelProvider)来显示节点的相关信息,包括显示内容和图 标。
ILabelProvider主 要实现getImage和getText函数。当TreeViewer得到一个节点后会通过getText得到此节点的显示文本,通过getImage方 法得到节点的显示图标,代码如例程2所示。
例 程2  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); 
  } 

 }


TreeViewer实例


在TreeViewer实例中,一般还要定义树节点 的结构。本例中的File对象就能够表示节点的父子关系,代码如例程3所示。 
例程3  FileBrowserTreeViewer.java

/**
 * 为了节省篇幅,把所有的import类注释了 
 * 读者可以通过ctrl+shift+o快捷键,自动引入所依赖的类
 * */ 
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[] bj = getChildren(arg0);

  // 判断树是否有下一级节点,true为在节点显示"+"信息 
  return bj == 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”复选按钮选择是为原有显示文本还是全部大写显示文本。

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

展开阅读全文

Python数据分析与挖掘

01-08
92讲视频课+16大项目实战+源码+¥800元课程礼包+讲师社群1V1答疑+社群闭门分享会=99元   为什么学习数据分析?       人工智能、大数据时代有什么技能是可以运用在各种行业的?数据分析就是。       从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过数据分析进一步挖掘出数据价值,它和编程一样,本质上也是一个工具,通过数据来对现实事物进行分析和识别的能力。不管你从事什么行业,掌握了数据分析能力,往往在其岗位上更有竞争力。    本课程共包含五大模块: 一、先导篇: 通过分析数据分析师的一天,让学员了解全面了解成为一个数据分析师的所有必修功法,对数据分析师不在迷惑。   二、基础篇: 围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析与挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。   三、数据采集篇: 通过网络爬虫实战解决数据分析的必经之路:数据从何来的问题,讲解常见的爬虫套路并利用三大实战帮助学员扎实数据采集能力,避免没有数据可分析的尴尬。   四、分析工具篇: 讲解数据分析避不开的科学计算库Numpy、数据分析工具Pandas及常见可视化工具Matplotlib。   五、算法篇: 算法是数据分析的精华,课程精选10大算法,包括分类、聚类、预测3大类型,每个算法都从原理和案例两个角度学习,让你不仅能用起来,了解原理,还能知道为什么这么做。
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值