- 浏览: 2480892 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
FROM:http://www.ibm.com/developerworks/cn/opensource/os-ecl-gef/part2/index.html
2006 年 11 月 30 日
Router(连线路由器)是对连线进行布局的重要组件,本文介绍了路由器的基本概念和应用场景,剖析了一个连线路由器的接口并给出了一个简单实例。最后演示了如何把自定义的路由器应用到图形中,使得不同的连线可以有不同的路由器。
ConnectionRouter(连线路由器)
图形之间连线的路线,是由连线路由器来决定的。在Shapes Examples中,使用了最短路径路由器,这个路由器会帮我们绕开图形之间的障碍,选择一条最短路径进行连接,如图1所示:
图1. ShortestPathConnectionRouter效果图
我们看到左右两边图形的连线绕过了中间的图形,在两处发生了转折。这就是使用了最短路径路由器的效果。连线路由器可以安装到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所示:
图2. SingleBendpointConnectionRouter效果图
也许这种路由器并没有太多的通用性,但是我们只是作为一个例子演示路由器的实现,了解了基本方法之后,再去实现更复杂更实用的路由器也就大同小异了。
路由器实现的前提
显然我们无法凭空的计算出线路的走向,一条连线的具体路线和很多因素有关,比如锚点、图形的位置和大小,图形之间的相互关系,等等。所以我们需要能够访问到这些必须的信息,在Connection接口中,我们有getTargetAnchor()和getSourceAnchor()可以让我们得到锚点,而在ConnectionAnchor接口中(参见本系列第一部分),我们有getOwner()这样的方法,可以得到图形。这些必要的方法为我们实现路由器提供了可能。
实现route方法
route方法的代码如下:
- public void route(Connection conn) {
- // 清空连线的所有点
- PointList points = conn.getPoints();
- points.removeAllPoints();
- // 得到目标和源参考点
- Point sourceRef = conn.getSourceAnchor().getReferencePoint();
- Point targetRef = conn.getTargetAnchor().getReferencePoint();
- A_POINT.setLocation(sourceRef.x, targetRef.y);
- // 得到起始点和结束点
- Point startPoint = conn.getSourceAnchor().getLocation(A_POINT);
- Point endPoint = conn.getTargetAnchor().getLocation(A_POINT);
- // 添加起始点
- A_POINT.setLocation(startPoint);
- conn.translateToRelative(A_POINT);
- points.addPoint(A_POINT);
- // 添加转折点
- A_POINT.setLocation(sourceRef.x, targetRef.y);
- conn.translateToRelative(A_POINT);
- points.addPoint(A_POINT);
- // 添加结束点
- A_POINT.setLocation(endPoint);
- conn.translateToRelative(A_POINT);
- points.addPoint(A_POINT);
- // 设置连线经过的所有点
- conn.setPoints(points);
- }
一条连线实际上是通过一系列的点来描述的,而route方法的实际任务也就是计算出这些点的位置。所以我们一开始就得到了这条连线的点序列(PointList对象),然后清空它,重新计算这些点。在我们这个路由器的设计里,一条连线由三个点组成:分别是起始点,转折点和结束点,它们构成了两条垂直的直线。起始点和结束点(也就是锚点)我们都已经了解如何得到了,中间的转折点,也很容易得出,我们就不解释了。要指出的是,我们需要把它们的坐标转换为相对坐标再添加,同时在添加完成之后,我们还需要调用setPoints()方法,这样才会生效。
所以说实现一个路由器的过程是很简单的,复杂之处在于路由算法,但这已经不属于GEF的范畴,所以我们就不讨论它了。
改变连接层的路由器
我们只是实现了路由器,还没有把这个路由器设置为缺省的路由器,所以我们还要做一点小修改,在DiagramEditPart的createFigure()方法里,将ShortestPathConnectionRouter替换为SingleBendpointConnectionRouter即可。
待改进的地方
我们的自定义路由器很简单,但是它也有一点小问题,当两个图形在垂直或水平方向有重叠时,连线看上去有点不正常,如图3所示:
图3. 一点小bug
这只是由于我们的路由器算法不是很完善,没有考虑到所有情况而已。你可以尝试修改一下route的算法,改正这个问题,我们这里就不详细演示了。
为连线指定路由器
我们目前是将路由器安装到了连接层,于是所有的连线都会使用同一个路由器,有些时候为了让布局更加灵活,我们需要为一条或多条连线指定一个不同的路由器。由于Connection接口中提供了setConnectionRouter()方法,因此这是可以实现的。
修改model
为了让连线知道它要使用何种路由器,我们需要修改连线的model,把当前的路由器种类存进去,我们在Connection.java里面加上一个routerId的成员,同时再定义一些表示不同路由器的常量:
- // router id constant
- public static final int SHORTEST_PATH_ROUTER = 0;
- public static final int MANHATTAN_ROUTER = 1;
- public static final int SINGLE_BENDPOINT_ROUTER = 2;
- private int routerId;
- public int getRouterId() {
- return routerId;
- }
- public void setRouterId(int routerId) {
- this.routerId = routerId;
- }
添加属性
为了能够随时修改连线的路由器,我们为连线添加一个router属性,由于这些内容不在本文讨论范围中,所以不一一描述了。完成之后,我们可以在属性视图中看到连线的路由器属性和可选值:
图4. Router属性
于是我们就可以让多种连线方式共存了,对于复杂的图形来说这样可以尽量避免连线重叠,增加布局的美观程度。
图5. 使用多种路由器
结束语
GEF中的几乎一切东西都可以定制,本文介绍的是连线路由器的定制,我们可以把这些内容和上一部分的自定义锚点结合起来,构建更为灵活的布局。不过,不要忘记了Draw2D自带的那些路由器,实在找不到合适的,可以考虑使用自定义的路由器。
org.eclipse.gef.examples.shapes_anchor.zip | HTTP |
发表评论
-
Java程序员25个必备的Eclipse插件
2012-01-12 22:36 21945原文:http://www.fromdev.com/2012/ ... -
关于插件更新安装的错误
2007-12-21 20:12 2229在更新插件的时候出现这样的错误: Unable to comp ... -
最近做eclipse branding, features的一些经验
2007-12-16 01:24 4566知道eclipse的splash怎么做 ... -
GEF学习笔记
2007-12-07 20:20 4175GEF以前学习过, 而且还 ... -
SWT布局深入学习
2007-11-30 23:00 7959以下内容是学习"The Definitive Gui ... -
Eclipse Action 深入学习笔记(3)
2007-11-25 17:59 4117filter元素是用来指定当 ... -
Eclipse Action 深入学习笔记(2)
2007-11-25 17:14 5237Object Action 这种Action是跟弹出的上下文菜 ... -
Eclipse Action 深入学习笔记(1)
2007-11-25 17:07 7688以前做插件用到的ActionSet都只是依葫芦画瓢,没有真正理 ... -
JFace Text Editor完全掌握之终极指南(4)
2007-11-24 17:08 5691错误标识(Error Marking) Error Marki ... -
JFace Text Editor完全掌握之终极指南(3)
2007-11-24 16:56 5527内容大纲 之所以要给编 ... -
JFace Text Editor完全掌握之终极指南(2)
2007-11-24 16:53 6749最后一步就是实现各种功能 语法高亮 首先我们要实现的是语法高亮 ... -
JFace Text Editor完全掌握之终极指南(1)
2007-11-24 16:17 10014JFace Text Editor是JFace里面一个功能强大 ... -
最近的Eclipse plugin开发总结
2007-11-24 11:30 4951List控件没有提供addDblClickListener方法 ... -
eclipse3.3关于JavaFileEditorInput兼容性问题的解决
2007-11-24 11:22 4684在eclipse3.3中,JavaFileEditor ... -
Eclipse WTP Projects Facets实战指南(2)
2007-11-21 21:13 5277修饰工作 给facet在选择列表中添加图标 格式如下: xml ... -
Eclipse WTP Projects Facets实战指南(1)
2007-11-21 20:21 9604这个文章基本是"Building Project F ... -
也说关于WizardPage的动态生成
2007-11-05 14:26 5167在Eclipse中一个Wizard=Wiza ... -
关于多页编辑器中不同Editor之间的Redo&Undo冲突的解决
2007-09-03 15:17 4081在我们的插件工具的开 ... -
TextEditor原理分析笔记
2007-08-23 15:48 3391Editor的语法着色原理:Eclipse使用damage , ... -
最近的Eclipse开发总结
2007-08-23 15:46 2139java.lang.IllegalAccessError: t ...
相关推荐
GEF示例 博文链接:https://xyhsm.iteye.com/blog/67809
**DRAW2D** 是GEF的一部分,专注于二维图形的绘制和管理。DRAW2D提供了基本的图形绘制功能,包括形状、线条、文本等元素,并支持事件处理和动画效果。开发者可以利用DRAW2D创建自定义的图形元素,并在GEF环境中进行...
- **IBM社区文档**:“GEF进阶,第一部分:Anchor”(http://www.ibm.com/developerworks/cn/opensource/os-ecl-gef/part1/index.html) - **其他资源**:了解更多的GEF教程和技术文档,可以帮助开发者更好地理解和运用...
GEF: Graphical Editing Framework <br>GEF是一套MVC Framework,它能帮你比较容易的建立图形化的编辑器,V(View)的部分常常是基于SWT的Draw2D,因此Draw2D也看作是GEF的一部分。依赖:org.eclipse.gef***, org...
Eclipse图形编辑框架(GEF) Eclipse提供了Eclipse集成的最终用户工具,包括创作( )和词云渲染环境()以及框架组件( , , , , , , , 和 )来创建基于Eclipse集成或独立的丰富的基于JavaFX和SWT的图形化...
**RCP(Rich Client Platform)** 是Eclipse项目的一个核心组成部分,它提供了一个框架,用于构建功能丰富的桌面应用程序。RCP允许开发者利用Java语言和Eclipse插件体系结构来创建可扩展、模块化的应用程序,这些...
Gef框架详解:初学者入门与进阶指南 Gef(GDB Enhanced Framework)是一个强大的GDB(GNU调试器)扩展,旨在提供一个更现代、功能更丰富的交互式环境,用于调试C、C++和其他支持GDB的语言。这个压缩包包含了关于Gef...
2.GEF 的结构: GEF 的结构决定了 GEF 应用程序的复杂性,即使最简单的 GEF 程序也包含五六个包和十几个类。 3.GEF 的入门方法: 学习 GEF 的最好方法是结合具体的例子,一边看代码,一边对照文档,然后自己再...
**Eclipse图形化编辑框架(GEF)** Eclipse图形化编辑框架(GEF)是Eclipse平台中的一个重要组件,主要用于构建可自定义的图形编辑工具。它为开发人员提供了一套全面的API和设计模式,使得创建复杂的图形用户界面...
GEF主要由三部分组成:MVC(Model-View-Controller)、Command和Zest。MVC模式用于分离数据模型、视图和控制器,使得代码结构清晰,易于维护。Command模块则实现了撤销/重做功能,使得用户操作可逆。Zest是GEF的图表...
Gef,全称Graphical Editing Framework,是Eclipse项目的一部分,是一个用于构建图形编辑框架的开源库,主要用于开发基于Swing或SWT的图形用户界面应用。这个框架支持模型驱动的编辑环境,允许开发者创建复杂的图形...
2. **GEF组件**: - **Figure**:表示图形元素,如线条、矩形等,是视图的基本组成单元。 - **Part**:封装了Figure,代表图形编辑中的一个可操作对象。 - **GraphicalViewer**:作为图形查看器,管理多个Part的...
由于工作的需要,最近开始研究GEF(Graphical Editor Framework)这个框架,它可以用来给用户提供图形化编辑模型的功能,从而提升用户体验,典型的应用如图形化的流程设计器、UML类图编辑器等等。
【描述】中的"六个小例子"是指通过一系列逐步进阶的教程,帮助开发者从基础到高级理解并掌握GEF的使用。这些例子旨在帮助初学者逐步理解GEF的工作原理,以及如何利用其功能构建复杂的图形用户界面。每个例子都增加了...
2. **在ViewPart中使用GEF**:通常情况下,GEF主要用于创建图形编辑器(Editor),但本示例特别指出在非Editor的ViewPart中使用GEF。ViewPart是Eclipse RCP(Rich Client Platform)中的一个组件,用于显示各种视图...
Gef的主要目标是为逆向工程师提供一个统一的平台,以便更好地理解二进制代码的行为。它支持多种操作系统,如Linux、macOS和Windows,并且与GDB的多个版本兼容。 在学习Gef时,首先要掌握如何安装和配置。这通常涉及...
2. **创建第一个项目**:使用GEF工作流创建一个简单的图形编辑器,如画板和基本图形。 3. **实现命令**:编写自定义命令以处理用户操作,如添加、删除和移动图形元素。 4. **图形交互**:实现DirectEdit和手势识别,...