- 浏览: 979749 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
运乃强谦:
老哥,你确定这个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程序运行
系列一中,我们完成了一个MVC结构,并初步构造了一个Editor,不过到现在Editor里什么东西都还没有,这节中我们要给它加一点东西。
一、配置和初始化Editor
要想让Editor真正开始工作,我们就需要做一些基础工作了。我们可以看到,当我们写了一个继承自GraphicalEditorWithPalette类的editor时,默认有几个方法需要实现。其中有一个方法:initializeGraphicalViewer()。看名字就知道这是一个用来初始化editor的方法。比如说editor一打开有什么内容等等就是在这里做的,我们可以给它加一个HelloWorldModel。另外,我们在系列一最后部分创建了一个EditPartFactory,我们需要把它配置到我们的Editor上去,这个也可以在initializeGraphicalViewer()方法里完成。不过,这里我们可以实现另一个方法:configureGraphicalViewer()。在那里完成也行。这里因此最后我们还需要配置一些东西,所以EditPartFactory就在方法configureGraphicalViewer()里完成。这样,内容分别如下:
@Override
protected void initializeGraphicalViewer() { getGraphicalViewer().setContents(new HelloWorldModel()); } @Override protected void configureGraphicalViewer() { super.configureGraphicalViewer(); getGraphicalViewer().setEditPartFactory(new DiagramEditPartFactory()); }
简单来说:initializeGraphicalViewer里实现一些初始化的的东西,例如内容;configureGraphicalViewer实现一些配置的东西,例如factory,rootpane。
我们看一下此时的效果:
图一
呵呵,已经出了一个图了。只是有点死板而已。好像图有点大。下面我们来做一些改变(临时方式)。
在系列一,我们最后修改了一下HelloWorldModel,给它添加了一个属性constraint,用来设置图形的大小和位置。这里我们就要用到它了。
首先我们修改一下HelloWorldEditPart的createFigure()方法,追加一句,如下:label.setBounds(helloworld.getConstraints());
再运行,发现效果还是没变化。这是因为Editor默认的rootEditPart是ScalableRootEditPart,看doc里描述这种类型的RootEditPart会自动让图层填满整个空间。我们把它修改一下即可。在Editor的configureGraphicalViewer()方法里追加一句:getGraphicalViewer().setRootEditPart(new ScalableFreeformRootEditPart());即可,这是一个支持伸缩功能的RootEditPart,一般情况下我们都可以以此对象作为RootEditPart。
再运行看效果:
图二
呵呵,已经有点样子。不过现在的问题就是加来加去,也只加一个图形。要怎么才能加更多的图形呢?
二、创建多层结构
为了能添加更多的图形,我们需要再创建一层模型,用来包括0个或多个HelloWorldModel,然后把这个新模型作为Editor的contents。暂且把我们的新的模型命名为:DiagramRootContent。一般来说我们都可以通过多加一些对象层来实现对多个对象的组合、分拆,例如对于一个类模型,我们可以直接用类模型管理变量和方法,也可以新增加一个是间层:方法层和变量层;类只关心这两个层,然后让它们分别关心变量和方法, 这样整个模型结构会显得更清淅。
多了不说,因为新增加了对象,还是那三部曲重写一次过程。不过需要多说一点是:因为这个新的模型只是一个用来包含其他模型的容器,因此显然:需要有一个用来指示所有的子模型的变量和分别用来增加了移除子模型的方法。好,这差不多就够了。先写出来再说:
public class DiagramRootContent { private List<HelloWorldModel> children = new ArrayList<HelloWorldModel>(); public void addChild(HelloWorldModel child) { if (!children.contains(child)) { children.add(child); } } public void removeChild(HelloWorldModel child) { if (children.contains(child)) { children.remove(child); } } public List<HelloWorldModel> getChildren(){ return children; } }
再创建一个对应的EditPart。
public class DiagramRootContentEditPart extends AbstractGraphicalEditPart { @Override protected IFigure createFigure() { ScalableFreeformLayeredPane layer = new ScalableFreeformLayeredPane(); layer.setLayoutManager(new FreeformLayout()); return layer; } @Override protected void createEditPolicies() { } }
一个好的实践是对于每个Model,都实现对应的Editpart。
这里要注意:和SWT一样,容器的Figure要记得设置布局,要不子元素可能就显示不出来了。这里我设置的是FreeformLayout。
最后,在EditPartFactory里追加一段,用于关联这些对象:
if(model instanceof DiagramRootContent){ DiagramRootContentEditPart editPart = new DiagramRootContentEditPart(); editPart.setModel(model); return editPart; }
好了,一个新模型的MVC结构就定义好了。最后,为了让Editor显示这个新的内容,我们还是修改Editor的initializeGraphicalViewer()方法。例如:
@Override protected void initializeGraphicalViewer() { HelloWorldModel model1 = new HelloWorldModel(); model1.setConstraints(new Rectangle(0,0,100,20)); HelloWorldModel model2 = new HelloWorldModel(); model2.setConstraints(new Rectangle(100,50,100,20)); HelloWorldModel model3 = new HelloWorldModel(); model3.setConstraints(new Rectangle(50,100,100,20)); DiagramRootContent content = new DiagramRootContent(); content.addChild(model1); content.addChild(model2); content.addChild(model3); getGraphicalViewer().setContents(content); }
运行一下试试。有效果吗?好像没有。为什么没有呢?
在GEF中,有一些“关键”方法的存在。正是因为这些“关键”方法的存在才使得我们能够正确的完成各种任务。关键一词我打个引号,因为是我自己的理解。
回想一下上面:我们的确构造了一个content模型,里面的确有一个属性用来存所有的子模型。但是这只是我们自己的理解,GEF怎么知道是哪个属性代表所有的子模型呢?我们得有一个地方告诉它啊。对吧?有道理没?其实这样的地方有很多的,比如说后面要讲到连接。先不扯远了,把当前的事情 做完。
我们再看看Content的EditPart。看看还有没有什么其他的方法需要重写。有一个:getModelChildren()。意思就是说得到模型的子。不要选成了getChildren()哦。就像后面的连接一样,也要选getModel**,这个稍记一下就行了。
好了,重写这个方法如下:
@Override protected List<HelloWorldModel> getModelChildren() { return ((DiagramRootContent)getModel()).getChildren(); }
再运行一下:
图3
OK,图形成功被显示出来了。
这一部分就到这,接下来就是讲更进一步的内容了。
小提示:如果以上过程中,图出来显示的不一样,或者是图不出来。那有可能是你的图元选择不一样,或者是图元设置不一样。比如说透明之类的。 (废话)
发表评论
-
GEF中用鼠标移动画布
2011-12-27 13:37 1327第一步 增加Palette项: moveTool = n ... -
Draw2d的ScrollPane的使用
2011-04-19 15:05 1588ScrollPane scrollpane = ne ... -
GEF的动态变化二
2011-04-13 10:47 1299之前有一篇文件介绍怎么实现GEF Editor中的图元的渐近、 ... -
(译)Eclipse Zest二
2011-01-07 15:41 19155. Zest和JFace的例子 5.1 创建工程 创建一 ... -
(译)Eclipse Zest一
2011-01-07 15:14 28401. Eclipse Zest 1.1 概述 Eclips ... -
增加GEF的动态性
2011-01-06 10:25 1756在一个GEF应用中,最常的操作是移位和缩放。移位和缩放实现本身 ... -
GEF中Palette项的属性页显示
2010-11-04 14:25 1952一般来说我们只需要在GraphicalViewer部分显示在P ... -
定制GEF的Palette
2009-11-23 16:35 2502用GEF框架实现一个Editor时,会有一个默认的palett ... -
GEF增加之连接助手二
2009-10-29 16:01 1009上一篇说过怎么实现悬浮连接助手。一直想要怎么实现悬浮连接助手。 ... -
GEF功能增强之创建助手
2009-09-28 09:09 1675用过GMF就知道,GMF默认生成的editor有一个悬浮的创建 ... -
GEF功能增强之连接助手
2009-09-10 14:45 1780GEF图形编辑器中,通常 ... -
GEF中实现“拷贝为图片”
2009-09-06 09:13 1320在一个GEF的编辑器中,编辑器上是一个个的Figure,从外观 ... -
GEF中扩大、缩小时处理编辑行为
2008-12-30 10:54 1498我们为GEF应用提供了ZoomIn和ZoomOut功能之后,在 ... -
改变GEF的一些默认行为
2008-12-29 14:12 1390一、改变Layer GEF中会根据editpart的类 ... -
GEF中一个模型的多层图的问题
2008-12-26 16:00 1614一般来说,我们在做GEF的时候,通常是一个模型对应一个图,这个 ... -
GEF中增加ContextMenu的支持
2008-12-19 22:32 2609GEF中,增加对EditPart的右键菜单的支持是很普遍的一 ... -
增加Palette的拖放支持
2008-12-19 14:08 1937默认情况下,GEF中要创建一个新的结点都是通点在Palette ... -
给GEF拖放功能
2008-07-17 10:26 1862我们知道SWT支持Native的拖放。GEF使用SWT的拖放来 ... -
修改GEF中Connection的端点
2008-07-14 16:09 1794GEF中,选中一条连接线,默认的端点是两个小黑框,如下: ... -
GEF中导视图的使用
2008-07-10 17:01 2151有时增加一个导视图能给用户很大的方便性,例如在outline视 ...
相关推荐
GEF理解之第三部分,学习gef必备文档资料啊,值得下载
GEF理解之第一部分,学习gef必备文档资料啊,值得下载
GEF入门必读 GEF入门系列 GEF-whole-upload 感谢八进制
GEF 入门系列 GEF
Eclipse插件开发:GEF入门系列宝典
GEF入门系列,八进制 的GEF入门系列教程, 由社区经作者授权后整理而成GEF(Graphical Editor Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。这样的应用程序有很...
由于工作的需要,最近开始研究GEF(Graphical Editor Framework)这个框架,它可以用来给用户提供图形化编辑模型的功能,从而提升用户体验,典型的应用如图形化的流程设计器、UML类图编辑器等等。
适合gef初学者学习,本人认为是一个很不错的学习材料
GEF是公司内部资料,在此提供给大家学习参考。
emf介绍系列和gef入门介绍打包,适合新人快速掌握。
Eclipse插件开发--gef开发指南与入门系列宝典打包下载。
RCP GEF 入门教程,从法语班翻译过来的,自认为是比较全面细致的GEF入门教程,比八进制的《GEF入门系列》要浅显易懂。
GEF-ALL-3.7 GEF-ALL-3.8 官方包。 GEF Draw2d 学习资料
资源就不用多介绍了,想下的都知道是什么东西。。。 这是非加密版,所以你可以随意加注释,作笔记
GEF: Graphical Editing Framework <br>GEF是一套MVC Framework,它能帮你比较容易的建立图形化的编辑器,V(View)的部分常常是基于SWT的Draw2D,因此Draw2D也看作是GEF的一部分。依赖:org.eclipse.gef***, org...
安装m2eclipse插件时会依赖gef插件和svn插件,压缩包内包含m2eclipse + gef + svn的全部插件安装包,可以直接离线安装,本人亲测,在Eclipse3.7下安装成功,可以新建Maven项目。 需要注意的是,在离线安装时,切记...
我下的资源的打包,希望有帮助,包括:GEF_Tutorial,GEF实例,入门教程,GEF-whole-upload
这是我参考了一些其他资料,自己写的一个GEF示例程序。 在这个demo中你可以看到以下的功能: 1. 往画布上添加多种节点 2. 节点之间的连线 3. 节点内容的编辑功能 4. 删除连线 5. 删除节点 6. 对节点的拖动以改变...