- 浏览: 995309 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
运乃强谦:
老哥,你确定这个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 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(Graphical Editing Framework)中,理解其工作流程对于开发图形编辑工具至关重要。GEF主要用于构建基于SWT和JFace的图形用户界面,它提供了丰富的功能来处理图形元素的绘制、操作和交互。本篇文章将深入探讨...
2. **GEF框架**: - GEF提供了图形编辑的基础组件,如模型、视图、控制器(MVC)架构。 - 它提供了一套图形工具,如绘图工具、选择工具和连接线工具。 - GEF支持命令模式,使得操作可以撤销/重做。 - 它还包含...
本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF的基础概念和实现方法。 GEF的核心功能是提供了一套强大的组件和API,用于创建可交互的、图形式的用户界面。通过使用GEF,开发者可以轻松地创建出具有拖放...
**GEF入门系列 PDF 格式资料** GEF(Graphical Editing Framework)是Eclipse开源组织推出的一个图形编辑框架,主要用于构建可视化的图形编辑...在阅读过程中,建议结合实际编程实践,以便更好地理解和掌握GEF的精髓。
- 示例代码:Eclipse项目中包含多个GEF示例,是学习和理解GEF的好资料。 - 在线教程:互联网上有许多博客和教程,针对不同水平的学习者提供了丰富的教学内容。 通过这个GEF入门系列,你可以逐步掌握如何利用GEF...
本入门系列旨在帮助初学者快速理解并掌握这两个强大的工具。 EMF是Eclipse项目的一部分,它提供了一种模型驱动的开发方式。EMF允许开发者创建、存储和操作数据模型,这些模型可以用来表示复杂的数据结构或业务逻辑...
2. "GEF入门系列(一、Draw2D).doc" 可能是一个逐步的教学系列,从基础的Draw2D开始,逐步引入GEF的概念和应用。 3. "如何在Eclipse3.3.1.1中安装VE,emf,GEF插件.doc" 提供了在特定版本的Eclipse中安装相关插件的步骤...
2. GEF的基本概念:深入理解模型、表示层、编辑器和控制器的概念。 3. 编辑器的生命周期:学习编辑器的创建、打开、保存和关闭过程。 4. 图形元素的定义:创建自定义的图形节点和连接线,定义它们的外观和行为。 5. ...
这个入门学习例子旨在帮助初学者理解GEF的基本用法和核心概念,通过实例展示如何利用GEF实现工具栏、菜单栏、属性栏以及图形的交互功能,如移动、删除、撤销、连线等,并涵盖了大纲视图和鹰眼功能的实现。...
为了帮助读者更好地理解GEF框架的实际应用,作者提供了由简至繁的一系列示例项目。这些项目按序排列,从最简单的pt1开始,逐步添加新功能,最终形成一个具备DirectEdit、Palette等功能的图形编辑器。这种逐步递进的...
这个实例代码2是《Eclipse插件开发》教程中的一部分,旨在帮助初学者理解如何利用GEF来创建自定义的图形编辑器。在Eclipse插件开发中,GEF提供了一套强大的框架,使得开发者可以方便地构建出功能丰富的图形用户界面...
4. **流程设计基础**:在gef框架下进行流程设计,首先要明确流程的目标和步骤,这可能涉及到对程序逻辑的理解和拆解,将复杂的任务分解为一系列可执行的子任务。这通常需要扎实的编程基础和问题解决能力。 5. **gef...
### GEF(Graphical Editing Framework)入门教程知识点详解 #### 一、简介 GEF(Graphical Editing Framework),即图形编辑框架,是一种基于...希望您能够通过实践加深对GEF的理解,并成功地应用于自己的项目中。
- **Control(控制器)**:这部分主要是由一系列`EditPart`组成,它们是GEF的核心组件。每个`EditPart`都对应于模型中的某个元素,并负责处理用户交互。 #### 四、Draw2D的核心组件——LightweightSystem **...
**gef-step2**可能是指系列教程的第二部分,可能涵盖了基本的GEF概念、工作台管理器、图元工厂、图形模型以及视图和编辑区的创建。在这一阶段,学习者通常会接触到如何构建基本的图形界面和实现简单的交互。 **gef-...
这个"eclipse_gef_example.rar"压缩包提供了一系列的例子,帮助开发者更好地理解和掌握GEF框架。以下是对每个部分的详细解释: 1. **org.eclipse.gef.examples.text** 这个部分主要展示了如何在GEF环境中处理文本...
2. **反汇编和指令分析**:gef可以展示程序的反汇编代码,帮助理解执行流程,并能解析和操作寄存器。 3. **调试信息**:gef能够显示函数调用栈、线程状态、共享库信息等,便于追踪问题源头。 4. **性能分析**:gef...