技术开发 频道

Eclipse开发经典教程:TreeViewer组件

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); } }

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


图1 TreeViewer组件


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

0
相关文章