两天前GEF发布了3.1M7版本,但使用下来发现和M6没有什么区别,是不是主要为了和 Eclipse版本相配套?希望3.1正式版早日发布,应该会新增不少内容。上一篇帖子介绍了如 何实现表格功能,在开发过程中,另一个经常用到的功能就是树,虽然SWT提供了标准的树控 件,但使用它完成如组织结构图这样的应用还是不够直观和方便。在目前版本(3.1M7)的 GEF中虽然没有直接支持树的实现,但Draw2D提供的例子程序里却有我们可以利用的代码 (org.eclipse.draw2d.examples.tree.TreeExample,运行界面见下图),通过它可以节约 不少工作量。
图1 Draw2D例子中的TreeExample
记得数年前曾用Swing做过一个组织结构图的编辑工具,当时的实现方式是让画布使用 XYLayout,在适当的时候计算和刷新每个树节点的位置,算法的思想则是深度优先搜索,非 树叶节点的位置由其子节点的数目和位置决定。我想这应该是比较直观的方法吧,但是这次 看了Draw2D例子里的实现觉得也很有道理,以前没想到过。在这个例子里树节点图形称为 TreeBranch,它包含一个PageNode(表现为带有折角的矩形)和一个透明容器contentsPane ,(一个Layer,用来放置子节点)。在一般情况下,TreeBranch本身使用名为NormalLayout 的布局管理器将PageNode放在子节点的正上方,而contentsPane则使用名为TreeLayout的布 局管理器计算每个子节点应在的位置。所以我们看到的整个树实际上是由很多层子树叠加而 成的,任何一个非叶节点对应的图形的尺寸都等于以它为根节点的子树所占区域的大小。
从这个例子里我们还看到,用户可以选择使用横向或纵向组织树(见图2),可以压缩各 节点之间的空隙,每个节点可以横向或纵向排列子节点,还可以展开或收起子节点,等等, 这为我们实现一个方便好用的树编辑器提供了良好的基础(视图部分的工作大大简化了)。
图2 纵向组织的树