[Eclipse]GEF入门系列(十一、树的一个实现) - 编程入门网
[Eclipse]GEF入门系列(十一、树的一个实现)时间:2011-04-19 cnblogs bjzhanghao两天前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 纵向组织的树 [Eclipse]GEF入门系列(十一、树的一个实现)(2)时间:2011-04-19 cnblogs bjzhanghao这里要插一句,Draw2D例子中提供的这些类的具体内容我没有仔细 研究,相当于把它们当作Draw2D API的一部分来用了(包括TreeRoot、TreeBranch、 TreeLayout、BranchLayout、NormalLayout、HangingLayout、PageNode等几个类,把代码拷 到你的项目中即可使用),因为按照GEF 3.1的计划表,它们很有可能以某种形式出现在正式 版的GEF 3.1里。下面介绍一下我是如何把它们转换为GEF应用程序的视图部分从而实现树编 辑器的。 首先从模型部分开始。因为树是由一个个节点构成的,所以模型中最主要的 就是节点类(我称为TreeNode),它和例子里的TreeBranch图形相对应,它应该至少包含 nodes(子节点列表)和text(显示文本)这两个属性;例子里有一个TreeRoot是TreeBranch 的子类,用来表示根节点,在TreeRoot里多了一些属性,如horizontal、majorSpacing等等 用来控制整个树的外观,所以模型里也应该有一个继承TreeNode的子类,而实际上这个类就 应该是编辑器的contents,它对应的图形TreeRoot也就是一般GEF应用程序里的画布,这个地 方要想想清楚。同时,虽然看起来节点间有线连接,但这里我们并不需要Connection对象, 这些线是由布局管理器绘制的,毕竟我们并不需要手动改变线的走向。所以,模型部分就是 这么简单,当然别忘了要实现通知机制,下面看看都有哪些EditPart。 与模型相对应 ,我们有TreeNodePart和TreeRootPart,后者和前者之间也是继承关系。在getContentPane ()方法里,要返回TreeBranch图形所包含的contentsPane部分;在getModelChildren()方法 里,要返回TreeNode的nodes属性;在createFigure()方法里, |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |