作者:梁祺 (eclipsesbs@gmail.com)
来自:http://www.benisoft.net/day3/index.html
今天我们来看一下TreeViewer,同样是使用“Plug-in with a view”模版,不过在向导的最后一页改用Tree viewer。
启动Eclipse前,先把eclipse.tutorial.day2的项目关闭,免得出现两个Sample View。启动Eclipse后, 找到Sample View,现在Sample View显示的是一个树状结构,有根节点,父节点,子节点组成。
双击Package Explorer View里的plug-in.xml,打开Plug-in Editor的Extensions子页, 你会发现内容和前面的例子一模一样。点击class打开Java类。
在Sample View里,TableViewer改成了TreeViewer了,多了一个DrillDownAdapter, DrillDownAdapter这里就不介绍了。
/**
* The ID of the view as specified by the extension.
*/
public static final String ID = \"eclipse.tutorial.day3.views.SampleView\";
private TreeViewer viewer;
private DrillDownAdapter drillDownAdapter;
private Action action1;
private Action action2;
private Action doubleClickAction;
还多了TreeObject和TreeParent两个内部类,这两个类比较简单,值得一提的是TreeObject实现IAdaptable接口。 对这个例子而言,这不是必须的。使用IAdaptable可以避免将真正的Model对象放在树上, 甚至可以更换Model对象而不用重新生成树。IAdaptable提供很高的灵活性。
private String name;
private TreeParent parent;
...
public Object getAdapter(Class key) {
return null;
}
}
ViewContentProvider实现了新接口ITreeContentProvider。 当需要显示TreeViewer的内容时,第一个调用的方法是getElement(),它接受参数parent, 这样根据不同的父节点parent,getElement()可以返回相应的子节点。 如果parent是getViewSite()返回的viewSite(就是viewer.setInput()时设置的对象),就返回根节点, 否则返回父节点的子节点。接下来getParent(),getChildren()和hasChildren()这三个方法必须行为一致, 否则随着TreeViewer使用,有可能碰到一些非常难以调试的问题,比如想要高亮选中某个节点,可能会不工作。
ITreeContentProvider {
private TreeParent invisibleRoot;
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object parent) {
if (parent.equals(getViewSite())) {
if (invisibleRoot==null) initialize();
return getChildren(invisibleRoot);
}
return getChildren(parent);
}
public Object getParent(Object child) {
if (child instanceof TreeObject) {
return ((TreeObject)child).getParent();
}
return null;
}
public Object [] getChildren(Object parent) {
if (parent instanceof TreeParent) {
return ((TreeParent)parent).getChildren();
}
return new Object[0];
}
public boolean hasChildren(Object parent) {
if (parent instanceof TreeParent)
return ((TreeParent)parent).hasChildren();
return false;
}
...
}
LabelProvider实现了getImage()方法, 为每个节点指定图标。
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);
}
}
Eclipse还提供了IColorProvider和IFontProvider使得我们可以为某些节点指定不同的颜色和字体。 IColorProvider提供getForeground(...)和getBackground(...)两个方法,分别用于指定前景色和背景色。 IFontProvider提供getFont(...)方法,指定显示时使用的字体。
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);
}
public Font getFont(Object element) {
if (element instanceof TreeParent)
return getSite().getShell().getDisplay().getSystemFont();
return null;
}
public Color getForeground(Object element) {
if (element instanceof TreeParent)
return getSite().getShell().getDisplay().getSystemColor(SWT.COLOR_RED);
return null;
}
public Color getBackground(Object element) {
if (element instanceof TreeParent)
return getSite().getShell().getDisplay().getSystemColor(SWT.COLOR_CYAN);
return null;
}
}
到这里,我们看了如何创建TreeViewer,TreeViewer和TableViewer一样,关键就是Content Provider, Content Provider提供需要显示的对象,Label Provider指定如何显示这些对象。
相关推荐
创建`TreeViewer`对象是构建过程的第一步,这通常在SWT组件容器内进行。例如: ```java TreeViewer tv = new TreeViewer(composite); ``` 其中,`composite`是指定的SWT容器,用于放置`TreeViewer`。 2. **...
第三篇主要讲述插件开发的高级内容,包括开发高级内容、富客户端平台技术(RCP)、Draw2d,以及GEF介绍与实现等4个章节;第四篇则围绕插件开发和GEF应用两个主题,精心设计了两个程序开发实例,使读者能更加全面地...
5. **第三章:高级主题** - **表与树组件**:讲解TableViewer和TreeViewer的用法,如何展示表格和树状结构数据,以及如何添加编辑功能。 - **菜单与工具栏**:介绍如何创建菜单栏、工具栏,并添加菜单项和工具按钮...
- 使用TableViewer和TreeViewer实现数据展示和编辑。 - 创建自定义对话框,如使用Dialog和Shell类。 - 事件驱动编程,实现用户交互响应。 - 使用Action和Command模式进行命令管理,提高代码复用性。 - 实现文件...
3. **第4章 使用基本控件与对话框**: - 学习如何创建和使用SWT的基本控件,如按钮、文本框、列表和树等。 - 掌握对话框的使用,包括消息对话框、输入对话框和文件选择对话框。 4. **第5章 容器与布局管理器**: ...
- 创建第一个SWT程序:创建一个简单的Hello, World程序,使用Shell作为顶级窗口,Button控件显示消息。 - 探索JFace:了解JFace如何简化SWT的使用,如利用TreeViewer和TableViewer展示数据。 - 练习MVC:通过创建...
3. 数据绑定:JFace的DataBinding机制允许开发者将模型数据与用户界面控件直接关联,实现数据的实时更新。 4. 视图和编辑器:研究如何定义和实现视图和编辑器,以及它们在Eclipse RCP(Rich Client Platform)中的...
第17章可能讲解了如何使用TableViewer和TreeViewer来显示和操作数据,包括排序、过滤、分页等高级功能。 7. **事件和监听器**:在GUI编程中,事件驱动模型是关键。第18章可能涉及SWT和JFace中的事件机制,包括添加...
第3章 Eclipse开发环境概述 22 3.1 Eclipse界面一览 22 3.2 Eclipse项目的文件结构 23 3.2.1 设置编译后.class文件的保存目录 23 3.2.2 导入项目使用的包 25 3.2.3 设置编译方式 26 3.2.4 运行程序 27 ...
Bootstrap-treeview是一个基于Bootstrap框架的jQuery多级列表树插件,它能够帮助开发者快速实现Web项目中的树形菜单功能。在开发中,我们经常需要通过树形结构展示数据,例如表示公司的组织架构、文件夹目录、网站...
5. **表和树视图**:第19章可能详细讲解如何使用TableViewer和TreeViewer创建数据驱动的视图。这些组件允许展示结构化的数据,并支持排序、过滤和自定义列。 6. **对话框和消息框**:Eclipse SWT提供了各种对话框,...