《2022年Eclipse开发经典教程:TreeViewer组件 .pdf》由会员分享,可在线阅读,更多相关《2022年Eclipse开发经典教程:TreeViewer组件 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Eclipse开发经典教程: TreeViewer 组件 TreeViewer 构建步骤 TreeViewer 中主要通过内容提供器(ITreeContentProvider )和标签提供器(ILabelProvider )组织树节点的内容和显示的信息。TreeViewer的构建步骤如下。 1. 创建 TreeViewer 对象,例如“TreeViewer tv = new TreeViewer(composite); ”。 2. 设定内容管理器,例如“tv.setContentProvider(new FileTreeContentProvider();”。 3. 设定标签提供器,例如“tv
2、.setLabelProvider(new FileTreeLabelProvider();”。 4. 设定 TreeViewer 的输入数据,例如“tv.setInput(root);” (用户可以通过输入数据构建树)。 TreeViewer 内容提供器 TreeViewer 的内容提供器(ITreeContentProvider )构建树中比较复杂的部分,它为树的显示提供了内容,内容提供器要实现的方法如下。 1. getElements 此函数定义为 “public Object getElements(Object inputElement);”,当程序开始构建树时, 首先调用 getE
3、lements 返回一个对象的数组, 此数组对象表示当前树的根节点, inputElement参数为 TreeViewer 的输入(setInput的输入数据)。 2. hasChildren 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 此函数定义为“public boolean hasChildren(Object element);”,当TreeViewer 显示一个节点后,会调用hasChildren 函数判断当前节
4、点是否有子节点,如果有子节点则显示“+”,element参数为要判断是否有子节点的节点。 3. getChildren 此函数定义为“public Object getChildren(Object parentElement);”,当用户选择节点打开子节点时,会调用getChildren函数返回下一层子节点,parentElement 参数为选择的节点。 4. getParent 此函数定义为 “public Object getParent(Object element);”,可以通过此方法返回 element 的父节点。 5. inputChanged 此函数定义为“public voi
5、d inputChanged(Viewer viewer, Object oldInput, Object newInput);”,当输入改变时调用此方法。 6. dispose 此函数定义为“public void dispose();”,当树销毁时被调用。 其中,getElements、hasChildren和 getChildren是常用的方法,用户通过重写这几个方法构建一棵树,过程如下: 通过 getElements 方法得到根, 再通过 hasChildren判断根下是否有子节点,如果有子节点,可以通过getChildren得到所有的子节点。如例程1 为 ITreeContentPr
6、ovider接口的一个简单实现。 例程 1 FileTreeContentProvider.java class FileTreeContentProvider implements ITreeContentProvider public Object getChildren(Object arg0) / 返回树的下一级节点名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - return (File) arg0).listFile
7、s();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
8、.out.println(arg0);/ File.listRoots()作为树的根节点return File.listRoots();上例内容提供器通过文件系统获得树的输入内容,从而使用户构造的树能显示磁盘文件的树结构。 在 TreeViewer 中,通过标签提供器 (ILabelProvider ) 来显示节点的相关信息,包括显示内容和图标。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - ILabelProvider主要
9、实现 getImage 和 getText 函数。当 TreeViewer 得到一个节点后会通过getText 得到此节点的显示文本,通过getImage 方法得到节点的显示图标,代码如例程2 所示。 例程 2 ViewLabelProvider.java class ViewLabelProvider extends ILabelProviderpublic String getText(Object obj) return obj.toString();public Image getImage(Object obj) String imageKey = ISharedImages.IMG
10、_OBJ_ELEMENT;if (obj instanceof TreeParent)imageKey = ISharedImages.IMG_OBJ_FOLDER;return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey); TreeViewer 实例 在 TreeViewer 实例中,一般还要定义树节点的结构。 本例中的 File 对象就能够表示节点的父子关系,代码如例程3 所示。 例程 3 FileBrowserTreeViewer.java 名师资料总结 - - -精品资料欢迎下载 - - - - - -
11、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - /* 为了节省篇幅,把所有的import 类注释了* 读者可以通过ctrl+shift+o快捷键,自动引入所依赖的类* */public class FileBrowserTreeViewer extends ApplicationWindow public FileBrowserTreeViewer() super(null);public void run() setBlockOnOpen(true);open();Display.getC
12、urrent().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);名
13、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - Button preserveCase = new Button(composite, SWT.CHECK);preserveCase.setText(&Preserve case);final TreeViewer tv = new TreeViewer(composite);/ 让树组件两端对齐tv.getTree().setLayoutData(new GridData(Gr
14、idData.FILL_BOTH);/ 添加内容管理器tv.setContentProvider(new FileTreeContentProvider();/ 添加标签管理器tv.setLabelProvider(new FileTreeLabelProvider();/ 设置 treeviewer的输入tv.setInput(root); / pass a non-null that will be ignoredpreserveCase.addSelectionListener(new SelectionAdapter() public void widgetSelected(Selec
15、tionEvent event) boolean preserveCase = (Button) event.widget).getSelection();FileTreeLabelProvider ftlp = (FileTreeLabelProvider) tv.getLabelProvider();ftlp.setPreserveCase(preserveCase););return composite;public static void main(String args) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
16、 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - new FileBrowserTreeViewer().run();/ 定义内容提供器class FileTreeContentProvider implements ITreeContentProvider public Object getChildren(Object arg0) / 返回树的下一级节点return (File) arg0).listFiles();public Object getParent(Object arg0) / 返回树的上一级节点return (File
17、) 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()作为树的根节点名师资料总结 - - -精品资料欢迎下载
18、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - return File.listRoots();public void dispose() public void inputChanged(Viewer arg0, Object arg1, Object arg2) / 定义标签提供器class FileTreeLabelProvider implements ILabelProvider private List listeners;private Image f
19、ile;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) 名师资料总结 - - -精品资料欢迎下载 - - -
20、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - public void setPreserveCase(boolean preserveCase) this.preserveCase = preserveCase;/ 触发事件,重新得到显示标签LabelProviderChangedEvent event = new LabelProviderChangedEvent(this);for (int i = 0, n = listeners.size(); i n; i+) ILa
21、belProviderListener 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 = (F
22、ile) arg0).getPath();/ 返回目录或文件的文件名return preserveCase ? text : text.toUpperCase();名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - public void addListener(ILabelProviderListener arg0) / 添加监听器listeners.add(arg0);public void dispose() if (dir
23、 != 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”复选按钮选择是为原有显示文本还是全部大写显示文本,
24、程序运行效果如图1 所示。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 图 1 TreeViewer 组件 TreeViewer 的功能比较强大,在复杂的应用可以用它代替SWT 的 Tree 组件,实现树的完美展现。 上例中文件“icons/file.gif”和目录“icons/directory.gif”的图片没有加入,读者可以加入相应的显示图片, 图片的位置为相对于当前工程根目录的相对路径。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -