您的位置:首页 > 编程语言 > Java开发

Eclipse开发经典教程之TreeViewer组件

2016-06-13 12:11 260 查看
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中,通过标签提供器(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”复选按钮选择是为原有显示文本还是全部大写显示文本,程序运 行效果如图1所示。

图1 TreeViewer组件

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

上例中文件“icons/file.gif”和目录“icons/directory.gif”的图片没有加入,读者 可以加入相应的显示图片,图片的位置为相对于当前工程根目录的相对路径。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: