快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

葡京娱乐场真人秀:EclipseGEF入门系列(十一、树的一个实现)



两天前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放在子节点的正上方,而c葡京娱乐场真人秀ontentsPane则应用名为TreeLayout的结构治理器谋略每个子节点应在的位置。以是我们看到的全部树实际上是由很多层子树叠加而成的,任何一个非叶节点对应的图形的尺寸都即因此它为根节点的子树所占区域的大年夜小。

从这个例子里我们还看到,用户可以选择应用横向或纵向组织树(见图2),可以压缩各节点之间的闲暇,每个节点可以横向或纵向排列子节点,还可以展开或收起子节点,等等,这为我们实现一个方便好用的树编辑器供给了优越的根基(视图部分的事情大年夜大年夜简化了)。

图2 纵向组织的树

这里要插一句,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()措施里,TreeNodePart应返回TreeBranch实例,而TreeRootPart要覆盖这个措施,返回TreeRoot实例;别的要留意在refreshVisuals()措施里,要把模型确当前属性精确反应到图形中,例如TreeNode里有反应节点当前是否展开的布尔变量expanded,则refreshVisuals()措施里必然要把这个属性确当前值赋给图形才可以。以下是TreeNodePart的部分代码:

选中节点的效果如下图,我根据必要改变了树节点的显示(改动PageNode类):

图3 同时选中三个节点(Node2、Node3和Node8)

着末一个葡京娱乐场真人秀ContainerHighlightEditPolicy的独一感化是当用户拖动节点到另一个节点区域中时,加亮显示后者,方便用户做出是否应该摊开鼠标的选择。它是GraphicalEditPolicy的子类,部分代码如下,假如你看过Logic例子的话,应该不难发明这个类便是我从那里拿过来然后改动一下获得的。

protected void showHighlight() {

((TreeBra葡京娱乐场真人秀nch) getContainerFigure()).setSelected(true);

}

public void eraseTargetFeedback(Request request) {

((TreeBranch) getContainerFigure()).setSelected(false);

}

好了,现在树编辑器应该已经能够事情了。为了让用户应用更方便,你可以实现展开/收起子节点、横向/纵向排列子节点等等功能,在视图部分Draw2D的例子代码已经内置了这些功能,你要做的便是给模型增添适当的属性。我这里的一个截图如下所示,此中Node1是收起状态,Node6纵向排列子节点(以节省横向空间)。

图4 树编辑器的运行界面

这个编辑器我花一天光阴就完成了,但假如不是使用Draw葡京娱乐场真人秀2D的例子,信托至少要四至六天,而且缺陷会对照多,功能上也不会这么完善。我感到在GEF中碰到没有实现过的功能前最好先找一找有没有可以使用的资本,比如GEF供给的几个例子就很好,当然首先要理解它们才谈得上使用。

您可能还会对下面的文章感兴趣: