- 浏览: 995277 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
运乃强谦:
老哥,你确定这个wsdl 地址 可以访问?
[CXF] Server与Client实现方式五:HTTPS -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
[CXF] Server与Client实现方式四:JMS -
dengmiao:
JAXB学习三 (验证) -
panamera:
你好。可以提供maven pom配置是怎么配置的?不知道你使用 ...
[CXF] Server与Client实现方式四:JMS -
u010221220:
请问楼主一二三部分的代码都应该放在哪个函数体中。
使用JDI监听Java程序运行
图一
从上图可以看到。GEF把SWT事件包装成一个个的request发送到Controller(EditPart)上,通过Controller(EditPart)来操作、修改模型和视图。但是Controller(EditPart)并不直接进行操作。而是由安装在Controller(EditPart)上的一个个Policy来完成的。每个Controller(EditPart)上会安若干个Policies。当然了Policy其实也不直接完成操作,而只是返回一个对应的Command,由Command去实现真正的操作。
图二
在GEF中,实现任何操作,都是同样的路子:安装对应的Policy-->返回某个Command-->执行(由框架调)
我们应该还记得在之前的篇段里,我们一直没讲到EditPart的一个方法:createEditPolicies()。下面,就要开始用到这个方法了。
一、图形的移动与缩放
常量名 |
类名 |
CONNECTION_ROLE |
ConnectionEditPolicy |
GRAPHICAL_NODE_ROLE |
GraphicalNodeEditPolicy |
COMPONENT_ROLE |
ComponentEditPolicy |
CONTAINER_ROLE |
ContainerEditPolicy |
DIRECT_EDIT_ROLE |
DirectEditPolicy |
。。。。。。 |
。。。。。。 |
- protected Command getConnectionCompleteCommand(CreateConnectionRequest request) ;
- protected Command getConnectionCreateCommand(CreateConnectionRequest request) ;
- protected Command getReconnectSourceCommand(ReconnectRequest request) ;
- protected Command getReconnectTargetCommand(ReconnectRequest request) ;
很显然,如果是要实现创建连接和重连的话,应该安装这个Policy,所以对应的安装就应该是:
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new **GraphicalNodeEditPolicy());
好了,废话少说。继续我们的事情。
要实现图形的移动和缩放,需要安装的Policy是LayoutEditPolicy,所以我们需要实现一个LayoutEditPolicy的子类,不过这里,我们要注意的是,我们应该继承的类为:XYLayoutEditPolicy。这是LayoutEditPolicy的一个子类。
在实现之前,我们先想一下,要实现移动或者是缩放,我们需要哪些东西。很显示,我们要有一个需要将要移动或缩放的结点对象吧,对吧?另外,我们得知道移动或缩放后的位置大小吧,对吧?所以我们的command如果想完成这个任务,那么它至少需要知道这两个东西。所以我们的Policy可以如下实现了:
public class DiagramLayoutPolicy extends XYLayoutEditPolicy { @Override protected Command createChangeConstraintCommand(EditPart child, Object constraint) { ResizeHelloWorldCommand command = new ResizeHelloWorldCommand( (HelloWorldModel) child.getModel(), (Rectangle) constraint); return command; } @Override protected Command getCreateCommand(CreateRequest request) { return null; } }
然后完成createChangeConstraintCommand(EditPart child, Object constraint) 方法,返回一个Command即可。如上我们已经返回了一个Command。下面我们就要实现这个Command。实现Command本身是很简单的。就是把模型设置为当前的大小。如下:
public class ResizeHelloWorldCommand extends Command { private HelloWorldModel model; private Rectangle constraints; private Rectangle old; public ResizeHelloWorldCommand(HelloWorldModel model, Rectangle constraints) { super(); this.model = model; this.constraints = constraints; } @Override public void execute() { old = model.getConstraints(); model.setConstraints(constraints); } @Override public void undo() { constraints = model.getConstraints(); model.setConstraints(old); } }
这里我们加了一个对象:old。这是为了实现重做与撤消用的。
现在我们试一下效果:
图三
图形已经可以缩放和拖动了。但是当我们把鼠标松开时,模型又回到了原处,变回了原来的大小了;打印一下可以知道:在模型中,图形的位置确实变了。这是怎么回事呢?
二、增加通知机制
如上,模型是发生了变化。因为这是一个MVC结构,图形并不知道模型的变化,所以图形不发生改变。要让图形发生变化。我们就需要有一个通知机制了。
一般来说,对模型有改变,都需要通过一种机制去通知视图进行刷新。在GEF中,通常这是通过属性改变监听机制来完成的。例如,当模型的constraint改变时,我们可以加一个监听。
这里的一个标准模式是:
1.模型做为事件源,由模型添加事件和发出事件
2.模型对应的EditPart作为事件处理者(因为模型不知道视图的存在)
通常我们可以用一个抽象类来专门处理属性改变,让所以模型继承这个类,例如:
public abstract class AbstractModel {
private PropertyChangeSupport support = new PropertyChangeSupport(this);
public void firePropertyChange(String propertyName, Object oldValue,
Object newValue) {
support.firePropertyChange(propertyName, oldValue, newValue);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
support.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
support.removePropertyChangeListener(listener);
}
}
添加监听和删除监听的地方在对应的editpart里,此时editpart本身要实现监听接口PropertyChangeListener,然后让模型的监听对象设为模型对应的EditPart。在EditPart里重写active()和deactive()方法,分别加上监听和移除监听;然后实现propertyChange方法,例如:
@Override
public void activate() {
super.activate();
((HelloWorldModel)getModel()).addPropertyChangeListener(this);
}
@Override
public void deactivate() {
((HelloWorldModel)getModel()).removePropertyChangeListener(this);
super.deactivate();
}
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals(HelloWorldModel.P_CONSTRAINT)){
refreshVisuals();
}
}
这里的active()方法是当EditPart激活时调用,deactive()方法当EditPart钝化时调用,有点像Plugin类里的start()和stop()方法。
上面说的有点乱,实际上那就是一个固定的样子,稍后我们会总结,理解后就很好写了。
好,为了实现更改大小和位置,我们首先要修改我们的模型,我们按照上面的样子写一个AbstractModel,然后让所有的模型继承这个类。
现在,我们有了一套通过机制了。下一步就是在我们所有修改了模型属性的方法里,利用这套机制,生成事件,例如HelloWorldModel更改大小事件:
public static final String P_CONSTRAINT = "p_constraint"; public void setConstraints(Rectangle constraints) { Rectangle old = getConstraints(); this.constraints = constraints; firePropertyChange(P_CONSTRAINT, old, constraints); }
修改HelloWorldEditPart:
1.首先让它实现接口:PropertyChangeListener
2.实现方法propertyChange:根据对应的属性事件名,执行不同的方法。例如:
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals(HelloWorldModel.P_CONSTRAINT)){
refreshVisuals();
}
}
我们先把这个refreshVisuals()方法写出来:
@Override protected void refreshVisuals() { super.refreshVisuals(); HelloWorldModel helloWorldModel = (HelloWorldModel) getModel(); ((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), helloWorldModel.getConstraints()); }
这里,按照我们之前说过的,子模型视图的大小和位置是通过父对象来设置的。因此我们重写refreshVisuals()方法,在方法里用父对象来更改子对象的图形大小和位置。这样在系列二中的那个(临时方式)就可以了不要了。因为每次创建图形的时候refreshVisuals()方法会自动被调到。
OK,最后就是添加监听事件了。
@Override public void activate() { super.activate(); ((HelloWorldModel)getModel()).addPropertyChangeListener(this); } @Override public void deactivate() { ((HelloWorldModel)getModel()).removePropertyChangeListener(this); super.deactivate(); }
最后再运行试一下效果:
图四
再总结一下要实现某个编辑操作的整个过程:
1。在对应的EditPart上安装某个Policy。
2。在Policy的实现里实现对应的方法。
3。在方法实现中,返回某个具体实现功能的Command。
4。在Command的实现中,通过调用模型提供的接口方法实现对模型的修改。
5。给模型添加一个PropertyChangeSupport对象,和三个方法:发出事件,添加监听,移除监听。每个方法调用PropertyChangeSupport对象的对应的方法。
6。在模型中的每个接口方法中都调用上面的Support对象发出事件
7。模型对应的EditPart实现PropertyChangeListener,然后完成方法propertyChange():根据不同的事件名,执行不同的操作。
8。添加监听:重写EditPart的active()方法和deactive()方法。其中在active()方法中添加监听,在deactive()方法中移除监听。
that's all!
发表评论
-
GEF中用鼠标移动画布
2011-12-27 13:37 1389第一步 增加Palette项: moveTool = n ... -
Draw2d的ScrollPane的使用
2011-04-19 15:05 1629ScrollPane scrollpane = ne ... -
GEF的动态变化二
2011-04-13 10:47 1379之前有一篇文件介绍怎么实现GEF Editor中的图元的渐近、 ... -
(译)Eclipse Zest二
2011-01-07 15:41 20155. Zest和JFace的例子 5.1 创建工程 创建一 ... -
(译)Eclipse Zest一
2011-01-07 15:14 29391. Eclipse Zest 1.1 概述 Eclips ... -
增加GEF的动态性
2011-01-06 10:25 1801在一个GEF应用中,最常的操作是移位和缩放。移位和缩放实现本身 ... -
GEF中Palette项的属性页显示
2010-11-04 14:25 2043一般来说我们只需要在GraphicalViewer部分显示在P ... -
定制GEF的Palette
2009-11-23 16:35 2568用GEF框架实现一个Editor时,会有一个默认的palett ... -
GEF增加之连接助手二
2009-10-29 16:01 1080上一篇说过怎么实现悬浮连接助手。一直想要怎么实现悬浮连接助手。 ... -
GEF功能增强之创建助手
2009-09-28 09:09 1737用过GMF就知道,GMF默认生成的editor有一个悬浮的创建 ... -
GEF功能增强之连接助手
2009-09-10 14:45 1819GEF图形编辑器中,通常 ... -
GEF中实现“拷贝为图片”
2009-09-06 09:13 1385在一个GEF的编辑器中,编辑器上是一个个的Figure,从外观 ... -
GEF中扩大、缩小时处理编辑行为
2008-12-30 10:54 1544我们为GEF应用提供了ZoomIn和ZoomOut功能之后,在 ... -
改变GEF的一些默认行为
2008-12-29 14:12 1436一、改变Layer GEF中会根据editpart的类 ... -
GEF中一个模型的多层图的问题
2008-12-26 16:00 1661一般来说,我们在做GEF的时候,通常是一个模型对应一个图,这个 ... -
GEF中增加ContextMenu的支持
2008-12-19 22:32 2656GEF中,增加对EditPart的右键菜单的支持是很普遍的一 ... -
增加Palette的拖放支持
2008-12-19 14:08 1977默认情况下,GEF中要创建一个新的结点都是通点在Palette ... -
给GEF拖放功能
2008-07-17 10:26 1908我们知道SWT支持Native的拖放。GEF使用SWT的拖放来 ... -
修改GEF中Connection的端点
2008-07-14 16:09 1864GEF中,选中一条连接线,默认的端点是两个小黑框,如下: ... -
GEF中导视图的使用
2008-07-10 17:01 2225有时增加一个导视图能给用户很大的方便性,例如在outline视 ...
相关推荐
【GEF理解系列1】是关于图形编辑框架(GEF,Graphical Editing Framework)学习的第一部分,对于理解和使用GEF进行图形化应用开发至关重要。GEF是一个强大的Java库,用于构建可视化的图形编辑器,它提供了创建、编辑...
【GEF理解系列二】是深入学习GEF框架的第二部分,主要讲解如何配置和初始化Editor,以及如何创建多层结构以支持添加多个图形。GEF(Graphical Editing Framework)是一个用于构建图形编辑器的开源框架,常用于开发...
在"GEF入门系列宝典"中,我们将深入探讨如何使用GEF进行Eclipse插件开发,以创建自定义的图形编辑器。以下是一些关键知识点: 1. **Eclipse插件体系结构**: - 插件是Eclipse的核心组成部分,它们通过OSGi模块系统...
本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF的基础概念和实现方法。 GEF的核心功能是提供了一套强大的组件和API,用于创建可交互的、图形式的用户界面。通过使用GEF,开发者可以轻松地创建出具有拖放...
**GEF入门系列 PDF 格式资料** GEF(Graphical Editing Framework)是Eclipse开源组织推出的一个图形编辑框架,主要用于构建可视化的图形编辑...在阅读过程中,建议结合实际编程实践,以便更好地理解和掌握GEF的精髓。
- 示例代码:Eclipse项目中包含多个GEF示例,是学习和理解GEF的好资料。 - 在线教程:互联网上有许多博客和教程,针对不同水平的学习者提供了丰富的教学内容。 通过这个GEF入门系列,你可以逐步掌握如何利用GEF...
本入门系列旨在帮助初学者快速理解并掌握这两个强大的工具。 EMF是Eclipse项目的一部分,它提供了一种模型驱动的开发方式。EMF允许开发者创建、存储和操作数据模型,这些模型可以用来表示复杂的数据结构或业务逻辑...
"GEF入门系列宝典.doc"可能更侧重于实践,提供逐步的教程和实例,帮助初学者快速上手。它可能包含一些实际的代码示例,教你如何构建一个简单的图形编辑器,例如绘制流程图或网络拓扑图。 通过学习这两份资料,你将...
**3gef**可能是这个系列教程的一个特定版本或者阶段,强调了对GEF的三次迭代改进或深化理解。这可能涉及到更高级的功能,如图形的动态更新、自定义手势识别或者与其他Eclipse插件的集成。 **gef_eclipse**标签表明...
2. "GEF入门系列(一、Draw2D).doc" 可能是一个逐步的教学系列,从基础的Draw2D开始,逐步引入GEF的概念和应用。 3. "如何在Eclipse3.3.1.1中安装VE,emf,GEF插件.doc" 提供了在特定版本的Eclipse中安装相关插件的步骤...
为了帮助读者更好地理解GEF框架的实际应用,作者提供了由简至繁的一系列示例项目。这些项目按序排列,从最简单的pt1开始,逐步添加新功能,最终形成一个具备DirectEdit、Palette等功能的图形编辑器。这种逐步递进的...
3. **图形绘制**: GEF提供了一系列类来支持图形的绘制,包括`Figure`、`RectangleFigure`、`EdgeFigure`等。用户可以自定义这些图形类,实现特定的绘制逻辑。 4. **移动、删除、撤销/重做**: 这些基本操作通过GEF的...
3. **gef的命令与功能**:gef提供了许多实用的命令,如`gef help`可以查看所有可用命令,`gef config`用于配置gef的设置,`gef load`则可以加载新的gef插件。此外,gef还包含了一些针对内存分析、反汇编、堆栈跟踪等...
### GEF(Graphical Editing Framework)入门教程知识点详解 #### 一、简介 GEF(Graphical Editing Framework),即图形编辑框架,是一种基于...希望您能够通过实践加深对GEF的理解,并成功地应用于自己的项目中。
这个"eclipse_gef_example.rar"压缩包提供了一系列的例子,帮助开发者更好地理解和掌握GEF框架。以下是对每个部分的详细解释: 1. **org.eclipse.gef.examples.text** 这个部分主要展示了如何在GEF环境中处理文本...
3. **调试信息**:gef能够显示函数调用栈、线程状态、共享库信息等,便于追踪问题源头。 4. **性能分析**:gef可以集成其他工具,如perf,进行性能分析,找出程序瓶颈。 5. **安全分析**:gef有内置的命令用于检测...
10. **示例和教程**:GEF通常会提供一系列的示例项目和教程,帮助开发者快速上手,理解和使用框架。 总的来说,"GEF.rar"压缩包可能是为开发者提供的一个完整的开发环境,包括了源代码、必要的库文件以及示例,使得...
GEF包含了一系列的类和接口,如Command、Model、View、EditPart、Figure等,它们共同构成了图形编辑的基础架构。Command代表可撤销/重做的操作,Model表示数据模型,View负责显示图形,EditPart作为模型和视图之间...