- 浏览: 534528 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
gaolegao2008:
如果报 is_volum 列名找不到之类的,我是从新部署了一个 ...
spring quartz 定时器报错 -
gaolegao2008:
部署到linux上时,还有一种情况就是mysql数据库区分大小 ...
spring quartz 定时器报错 -
qq123zhz:
yahier 写道 对我有帮助,但我看的一个demo程序,却没 ...
spring quartz 定时器报错 -
qq123zhz:
这个要在eclipse的插件环境下运行的,你不懂eclipse ...
GEF 自动布局 -
qq123zhz:
这个很久了,不记得啥时候写的了
json转为Map
第二部分:Router
Router(连线路由器)是对连线进行布局的重要组件,本文介绍了路由器的基本概念和应用场景,剖析了一个连线路由器的接口并给出了一个简单实例。最后演示了如何把自定义的路由器应用到图形中,使得不同的连线可以有不同的路由器。 ConnectionRouter(连线路由器) 图形之间连线的路线,是由连线路由器来决定的。在Shapes Examples中,使用了最短路径路由器,这个路由器会帮我们绕开图形之间的障碍,选择一条最短路径进行连接,如图1所示:
我们看到左右两边图形的连线绕过了中间的图形,在两处发生了转折。这就是使用了最短路径路由器的效果。连线路由器可以安装到Connection Layer(连接层,关于层的概念我们在本系列下一篇中讲述),也可以针对某一条连接,所以只要你愿意,每条连线都可以有不同的路由器。如果你没有为某条连线指定一个路由器,那么缺省会使用连接层的路由器。Draw2D自带了一些路由器的实现,除了图1的ShortestPathConnectionRouter,还有ManhattanConnectionRouter等路由器实现,如果这些自带的路由器不能满足我们的需要,我们所要做的就是实现ConnectionRouter接口,实现一个自定义路由器。ConnectionRouter接口并不复杂,如下所示: Object getConstraint(Connection connection); void setConstraint(Connection connection, Object constraint); void invalidate(Connection connection); void route(Connection connection); void remove(Connection connection); setConstraint和getConstraint用来设置/得到连接上的Constraint(约束),所谓Constraint是指加在某个连线上的一些参数。我们可以看到constraint是一个Object类型,因为不同的路由器可能对constraint有不同的要求,对于ShortestPathConnectionRouter来说,constraint需要是一个List对象,里面包含了所有的转折点。 invalidate方法可以将一个连线置为无效,这样在下一次布局操作时,无效的连接将被重新路由。remove方法是将连线从路由器中删除,也就是路由器不会再负责这条连线的布局,一般只有在删除一条连线的时候才会调用到,我们可以在里面做一些清除工作,比如释放和连线相关的cache。route方法是路由操作真正发生的地方,我们一般只需要实现route方法就可以了,如果你还想做一些其他的操作,可以考虑实现其他方法。同样,一般是不推荐直接实现ConnectionRouter接口的,我们可以继承AbstractRouter类,这个类提供了一些简单的或者空的实现,还提供了两个额外的方法getStartPoint()和getEndPoint()方便我们得到连线的两个端点。 SingleBendpointConnectionRouter 我们将实现一个自定义的路由器,叫做SingleBendpointConnectionRouter,它采用一种走直角的方式连接两个图形,如图2所示:
也许这种路由器并没有太多的通用性,但是我们只是作为一个例子演示路由器的实现,了解了基本方法之后,再去实现更复杂更实用的路由器也就大同小异了。 显然我们无法凭空的计算出线路的走向,一条连线的具体路线和很多因素有关,比如锚点、图形的位置和大小,图形之间的相互关系,等等。所以我们需要能够访问到这些必须的信息,在Connection接口中,我们有getTargetAnchor()和getSourceAnchor()可以让我们得到锚点,而在ConnectionAnchor接口中(参见本系列第一部分),我们有getOwner()这样的方法,可以得到图形。这些必要的方法为我们实现路由器提供了可能。 实现route方法 route方法的代码如下:
一条连线实际上是通过一系列的点来描述的,而route方法的实际任务也就是计算出这些点的位置。所以我们一开始就得到了这条连线的点序列(PointList对象),然后清空它,重新计算这些点。在我们这个路由器的设计里,一条连线由三个点组成:分别是起始点,转折点和结束点,它们构成了两条垂直的直线。起始点和结束点(也就是锚点)我们都已经了解如何得到了,中间的转折点,也很容易得出,我们就不解释了。要指出的是,我们需要把它们的坐标转换为相对坐标再添加,同时在添加完成之后,我们还需要调用setPoints()方法,这样才会生效。 所以说实现一个路由器的过程是很简单的,复杂之处在于路由算法,但这已经不属于GEF的范畴,所以我们就不讨论它了。 我们只是实现了路由器,还没有把这个路由器设置为缺省的路由器,所以我们还要做一点小修改,在DiagramEditPart的createFigure()方法里,将ShortestPathConnectionRouter替换为SingleBendpointConnectionRouter即可。 我们的自定义路由器很简单,但是它也有一点小问题,当两个图形在垂直或水平方向有重叠时,连线看上去有点不正常,如图3所示: 这只是由于我们的路由器算法不是很完善,没有考虑到所有情况而已。你可以尝试修改一下route的算法,改正这个问题,我们这里就不详细演示了。 我们目前是将路由器安装到了连接层,于是所有的连线都会使用同一个路由器,有些时候为了让布局更加灵活,我们需要为一条或多条连线指定一个不同的路由器。由于Connection接口中提供了setConnectionRouter()方法,因此这是可以实现的。 为了让连线知道它要使用何种路由器,我们需要修改连线的model,把当前的路由器种类存进去,我们在Connection.java里面加上一个routerId的成员,同时再定义一些表示不同路由器的常量:
为了能够随时修改连线的路由器,我们为连线添加一个router属性,由于这些内容不在本文讨论范围中,所以不一一描述了。完成之后,我们可以在属性视图中看到连线的路由器属性和可选值: 于是我们就可以让多种连线方式共存了,对于复杂的图形来说这样可以尽量避免连线重叠,增加布局的美观程度。
Shape例子 代码: 父模型 控制器中DiagramEditpart.java 中:
protected IFigure createFigure() { // TODO 自动生成方法存根
Figure f = new FreeformLayer(); f.setBorder(new MarginBorder(3)); f.setLayoutManager(new FreeformLayout());
// Create the static router for the connection layer ConnectionLayer connLayer = (ConnectionLayer)getLayer(LayerConstants.CONNECTION_LAYER); connLayer.setConnectionRouter(new ShortestPathConnectionRouter(f));
return f; } |
发表评论
-
eclipse jdt builder的资料
2014-07-11 15:27 939eclipse jdt关于builder的英文资料。。。。 ... -
eclipse 插件开发 Setting the Java build path
2014-06-04 11:00 1216JDT Plug-in Developer Guide & ... -
RCP MessageConsole设置显示的最大行数
2013-09-05 11:34 966MessageConsole.setWaterMarks(5 ... -
RCP FileSystem 文件系统
2013-02-19 10:42 1381public static File toLocalFile ... -
eclipse4.x 去掉quick access
2013-01-11 14:57 4057/** * 去掉quick access * ... -
RCP 分页组件
2012-12-26 16:59 1500http://www.eclipse.org/nebula/w ... -
jdt 核心知识
2012-11-27 21:39 1279jdt官方核心知识...................... ... -
jdt 创建java工程,生成代码,运行main方法
2012-11-27 10:50 2345public static IJavaProje ... -
SWT 隔行换色-自动宽高调整
2012-10-16 17:32 1710** * 创建:ZhengXi 2009-8-4 */ ... -
RCP 为action添加操作进度条
2012-10-16 13:59 1292public class StartAction extend ... -
RCP 视图交互 ISelectionProvider和ISelectionListener,只响应鼠标左键
2012-10-10 18:36 2247有时候一个视图( V ... -
采用jface dataBinding来实现内容填充
2012-07-27 15:42 1192//采用jface dataBinding来实现内容填充 ... -
RCP 在视图中获得首选项修改后的结果
2012-07-27 15:35 1152在视图或者编辑器中加入如下代码: Activator.get ... -
RCP获得eclipse的相关位置
2012-07-24 11:14 1074InternalPlatform.getDefault().g ... -
swt/jface 获取table所有的列的值
2012-07-24 09:24 1423TableItem [] items = table.get ... -
org.eclipse.swt.SWTException: Subclassing not allowed
2012-07-19 15:09 1241org.eclipse.swt.SWTException: S ... -
Job found still running after platform shutdown.
2012-06-29 16:40 1857Job found still running after p ... -
eclipse插件开发 打开指定透视图
2012-06-12 14:08 1448打开透视图 PlatformUI.getWorkbench( ... -
eclipse 插件开发,报错No property tester contributes a property....
2012-06-12 11:29 2113ENTRY org.eclipse.ui.navigator ... -
eclipse JDT相关知识
2012-06-11 10:14 3991Java项目模型 Eclipse的项目有很多种,包括J ...
相关推荐
标题中的“GEF资源打包”指的是一个集合了关于GEF(Graph Edit Framework)的各种学习资料的压缩文件。这个资源包可能包含了对理解、学习和使用GEF非常有帮助的材料。描述进一步说明了这个包中包含的具体内容,如...
这是我参考了一些其他资料,自己写的一个GEF示例程序。 在这个demo中你可以看到以下的功能: 1. 往画布上添加多种节点 2. 节点之间的连线 3. 节点内容的编辑功能 4. 删除连线 5. 删除节点 6. 对节点的拖动以改变...
这个入门学习例子旨在帮助初学者理解GEF的基本用法和核心概念,通过实例展示如何利用GEF实现工具栏、菜单栏、属性栏以及图形的交互功能,如移动、删除、撤销、连线等,并涵盖了大纲视图和鹰眼功能的实现。...
**GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台上广泛使用,特别是在开发复杂的图形用户界面和工具时。本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF...
在图形编辑框架(Graphical Editing Framework,简称GEF)中,悬空连线是一种常见的功能,它允许用户在图形画布上创建未连接到任何端点的连接线,以表示潜在的连接关系。这类连线通常在用户尝试建立节点之间的连接时...
Gef,全称Graphical Editing Framework,是Eclipse项目的一部分,是一个用于构建图形编辑框架的开源库,主要用于开发基于Swing或SWT的图形用户界面应用。这个框架支持模型驱动的编辑环境,允许开发者创建复杂的图形...
【GEF-ALL-3.7+GEF-ALL-3.8+GEF_Draw2d学习资料】是一份综合性的资源包,包含了GEF(Graphical Editing Framework)的3.7和3.8版本以及与其相关的Draw2D库的学习材料。GEF是Eclipse平台上用于构建图形化编辑器框架的...
**GEF(Graphical Editing Framework)** 是一个用于构建图形编辑工具的开源框架,它为开发人员提供了一套全面的库和工具,用于创建基于Eclipse的富客户端平台(RCP)的应用程序,特别是那些涉及图形用户界面(GUI)...
### GEF简易教程知识点详解 #### 一、GEF简介与环境配置 **GEF**,全称为**Graphical Editing Framework**,是Eclipse平台上用于创建复杂图形编辑器的框架。它提供了一套完整的工具集,使开发者能够构建具有图形化...
GEF(Graphical Editing Framework)是Eclipse平台上一个强大的图形编辑框架,主要用于构建可视化的建模和图形编辑工具。更新到3.7.1版本,它提供了许多改进和新功能,以满足开发者在创建图形用户界面时的需求。在这...
GEF的开发指南详细讲解了如何使用该框架进行图形编辑,内容涵盖了从创建RCP(Rich Client Platform)插件开始,到创建图形编辑器、与图形的交互、撤销/回复操作、缩放、快捷键设置、大纲视图、鸟瞰视图、环境菜单、...
### Eclipse的GEF框架深入解析 #### 一、GEF框架概述 GEF,全称为Graphical Editor Framework,是Eclipse平台下的一款图形编辑框架,主要用于构建图形化编辑器,如流程设计器、UML类图编辑器等。GEF遵循经典的MVC...
**GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台中被广泛使用。**GEF-SDK-3.7.0** 是这个框架的一个特定版本,提供了开发人员构建图形用户界面(GUI)和可视化编辑...
《GEF-SDK-3.6.2 jar:Eclipse GEF框架详解及在Android ADT中的应用》 GEF(Graphical Editing Framework)是Eclipse项目中的一个重要组成部分,它为开发图形化编辑器提供了强大的支持。在标题“GEF-SDK-3.6.2 jar...
**GEF(Graphical Editing Framework)开发指南** GEF(Graphical Editing Framework)是Eclipse平台上用于构建图形编辑器的开源框架。它提供了一套全面的API和工具,使得开发者可以方便地创建出复杂的图形用户界面...
**GEF(Graphical Editing Framework)教程与Demo源码详解** GEF,全称为Graphical Editing Framework,是Eclipse平台上用于构建图形化编辑器的一种框架。它为开发人员提供了丰富的工具,可以方便地创建出复杂的...
**GEF教程与DEMO源码解析** GEF(Graphical Editing Framework)是Eclipse平台下的一个图形编辑框架,主要用于构建可自定义的图形化编辑器。它为开发者提供了丰富的API和工具,使得开发人员可以方便地创建出复杂的...
### GEF快速入门教程与EMF教程概览 #### GEF HelloWorld 示例详解 本文将详细介绍如何使用Graphical Editing Framework (GEF)实现一个简单的“Hello World”示例,并结合Eclipse Modeling Framework (EMF)进行扩展...
**GEF 3.10 Eclipse 插件详解** **一、GEF简介** GEF(Graphical Editing Framework)是Eclipse平台中的一个图形编辑框架,用于构建图形化用户界面和图形编辑工具。它为开发者提供了创建可定制的、基于模型的图形...