您的位置:首页 > 其它

TreeViewer构建步骤

2011-02-25 17:00 459 查看



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[] 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();
}


在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[] 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);
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: