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

澳门新葡新京_龟发之家论坛



构造一个GEF利用法度榜样平日分为这么几个步骤:设计模型、设计EditPart和Figure、设计EditPolicy和Command,此中 EditPart是最主要的一部分,由于在实现它的时刻弗成避免的要应用到EditPolicy,而后者又涉及到Command。

现在我们来看个例子,它的功能异常简单,用户可以在画布上增添节点(Node)和节点间的连接,可以直接编辑节点的名称以及转变节点的位置,用户可以取缔/重做任何操作,有一个树状的大年夜纲视图和一个属性页。这是一个Eclipse的项目打包文件,在Eclipse里导入后运行Run-time Workbench,新建一个扩展名为"gefpractice"的文件就会打开这个编辑器。

图1 Practice Editor的应用界面

你可以参考着代码来看接下来的内容了,让我们从模型开始提及。模型是根据利用需求来设计的,以是我们的模型包括代表全部图的Diagram、代表节点的Node和代表连接的Connection这些工具。我们知道,模型是要认真把自己的改变看护给EditPart的,为了把这个功能分离出来,我们应用名为Element的抽象类专门来实现看护机制,然后让其他模型类承袭它。Element类里包括一个PropertyChangeSupport类型的成员变量,并供给了addPropertyChangeListener()、removePropertyChangeListener()和 fireXXX()措施分手用来注册 监听 器和看护 监听 器模型改变事故。在GEF里,模型的 监听 器便是EditPart,在EditPart的active ()措施里我们会把它作为 监听 器注册到模型中。以是,统共有四个类组成了我们的模型部分。

在前面的贴子里说过,大年夜部分GEF利用法度榜样都是实现为Editor的,这个例子也不例外,对应的Editor名为PracticeEditor。这个Editor承袭了GraphicalEditorWithPalette类,表示它是一个具有调色板的图形编辑器。最紧张的两个措施是 configureGraphicalViewer()和initializeGraphicalViewer(),分手用来定制和初始化 EditPartViewer(关于EditPartViewer的感化请查看前面的帖子),简单查看一下GEF的代码你会发明,在 GraphicalEditor类里会先后调用这两个措施,只是中心插了一个hookGraphicalViewer()措施,其感化是同步选择和把 EditPartViewer作为SelectionProvider注册到所在的site(Site是Workbench的观点,请查Eclipse赞助)。以是,与选择无关的初始化操作应该在前者中完成,否则放在后者完成。例子中,在这两个措施里我们设置设置设备摆设摆设了RootEditPart、用于创建 EditPart的EditPartFactory、Contents即Diagram工具和增添了拖放支持,拖动目标是当前 EditPartViewer,后面会看到拖动源便是调色板。

这个Editor是带有调色板的,以是要奉告GEF我们的调色板里都有哪些对象,这是经由过程覆盖getPaletteRoot()措施来实现的。在这个措施里,我们使用自己写的一个对象类PaletteFactory构造一个PaletteRoot工具并返回,我们的调色板里必要有三种对象:选择对象、节点对象和连接对象。在GEF里,调色板里可以有抽屉(PaletteDrawer)把各类对象归类放置,每个对象都是一个ToolEntry,选择对象(SelectionToolEntry)和连接对象(ConnectionCreationToolEntry)是预先定义好的几种对象中的两个,以是可以直接应用。对付节点对象,要应用CombinedTemplateCreationEntry,并把节点类型作为参数之一传给它,创建节点对象的代码如下所示。

ToolEntry tool = new CombinedTemplateCreationEntry("Node", "Create a new Node", Node.class, new SimpleFactory(Node.class), null, null);

在新的3.0版本GEF里还供给了一种可以自动暗藏调色板的编辑器GraphicalEditorWithFlyoutPalette,对调色板的外不雅有更多选项可以选择,今后的帖子里可能会提到若何应用。

调色板的初始化操作应该放在initializePaletteViewer()里完成,最主要的义务是为调色板所在的 EditPartViewer添加拖动源事故支持,前面我们已经为画布所在EditPartViewer添加了拖动目标事故,以是现在就可以实现完备的拖放操作了。这里轻细解说一下拖放的实现道理,以用来创建节点工具的节点对象为例,它在调色板里是一个 CombinedTemplateCreationEntry,在创建这个PaletteEntry时(见上面的澳门新葡新京代码)我们指定该工具对应一个 Node.class,以是在用户从调色板里拖动这个对象时,内存里有一个TemplateTransfer单例工具会记录下Node.class(称作 template),当用户在画布上松开鼠标时,拖放停止的事故被触发,将由画布注册的 DiagramTemplateTransferDropTargetListener工具来处置惩罚template工具(现在是Node.class),在例子中我们的处置惩罚措施是用一个名为ElementFactory的工具认真根据这个template创建一个对应类型的实例。

每个EditPart都有active()和deactive()两个措施,一样平常我们在前者里注册 监听 器(由于实现了 PropertyChangeListener接口,以是EditPart本身便是 监听 器)到模型工具,在后者里将 监听 器从列表里移除。在触发 监听 器事故的propertyChange()措施里,一样平常是根据"事故名"称抉择应用何种要领刷新视图,例如对付NodePart,假如是节点本身的属性发生变更,则调用refreshVisuals()措施,若是与它相关的连接发生变更,则调用refreshTargetConnections()或 refreshSourceConnections()。这里用到的事故名称都是我们自己来规定的澳门新葡新京,在例子中比如Node.PROP_NAME表示节点的名称属性,Node.PROP_LOCATION表示节点的位置属性,等等。

EditPart(确切的说是AbstractGraphicalEditpart)别的一个必要实现的紧张措施是createFigure(),这个措施应该返回模型在视图中的图形表示,是一个IFigure类型工具。一样平常都把这些图形放在figures包里,例子里只有NodeFigure一个自定义图形,Diagram工具对应的是GEF自带的名为FreeformLayer的图形,它是一个可以在东南西北四个偏向随意率性扩展的层图形;而 Connection对应的也是GEF自带的图形,名为PolylineConnection,这个图形缺省是一条用来连接别的两个图形的直线,在例子里我们经由过程setTargetDecoration()措施让连接的目标端显示一个箭头。

着末,要为EditPart增添适当的EditPolicy,这是经由过程覆盖EditPart的createEditPolicies()措施来实现的,每一个被澳门新葡新京"安装"到EditPart中的EditPolicy都对应一个用来表示角色(Role)的字符串。对付在模型中有子元素的 EditPart,一样平常都邑安装一个EditPolicy.LAYOUT_ROLE角色的EditPolicy(见下面的代码),后者多为 LayoutEditPolicy的子类;对付连接类型的EditPart,一样平常要安装 EditPolicy.CONNECTION_ENDPOINTS_ROLE角色的EditPolicy,后者则多为 ConnectionEndpointEditPolicy或其子类,等等。

installEditPolicy(EditPolicy.LAYO澳门新葡新京UT_ROLE, new DiagramLayoutEditPolicy());

用户的操作会被当前对象(缺省为选择对象SelectionTool)转换为哀求(Request),哀求根据类型被分发到目标EditPart所安装的EditPolicy,后者根据哀求对应的角色来判断是否应该创建敕令并履行。

在曩昔的帖子里说过,Role-EditPolicy-Command这样的设计主如果为了只管即便重用代码,例犹如澳门新葡新京一个EditPolicy可以被安装在不合EditPart中,而同一个Command可以被不合的EditPolicy所应用,等等。当然,凡事有利必有弊,我觉得这种的设计也有毛病,首先在代码上看来不敷直不雅,你必须对浩繁Role、EditPolicy有所懂得,增添了进修周期;别的大年夜部分不必要重用的代码也要按照这个相对繁杂的要领来写,带来了额外事情量。

以上便是一个GEF利用法度榜样里最基础的几个组成部分,例子中还有如Direct Edit、属性表和大年夜纲视图等一些功能没有解说,下面的帖子里将先容这些常用功能的实现。

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