- 浏览: 987523 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
运乃强谦:
老哥,你确定这个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程序运行
一、带箭头的连接线
PolylineConnection connection = super.createFigure() ;
PolygonDecoration decoration = new PolygonDecoration();
connection.setTargetDecoration(decoration);
return connection;
}
ArrowConnectionEditPart editPart = new ArrowConnectionEditPart();
editPart.setModel(model);
return editPart;
}
"plain", "this is arrow connection", new SimpleFactory(
ArrowConnectionModel.class), Activator
.getImageDescriptor("icons/arrowLine.gif"), Activator
.getImageDescriptor("icons/arrowLine.gif"));
selectionGroup.add(arrowConnection);
图一
二、增加连接线的路由点
现在,我们所有的连线都是直来直去的,不会打弯。这样的一个坏处就是,线会在图上画过。所以为了能更改连接线的路径,我们需要让连接线支持路由点。首先先不考虑其他的,我们单纯创建一个带路由点的线。
背景知识
要想让线支持路由,我们就需要为PolylineConnection设置新的ConnectionRouter对象,因为缺省的是ConnectionRouter.NULL;我们可以找一个ConnectionRouter的子类。这里我们设置为:BendpointConnectionRouter。
所以下面要怎么支持路由点,就由这个BendpointConnectionRouter说了算了。我们看一下BendpointConnectionRouter的源码,看看它是怎么取得和设置路由点的:
首先在方法:setConstraint(Connection connection, Object constraint)的实现里,以connection为键值,将所有这个connection的constraint放到一个Map里去了。
然后看方法:route(Connection conn);这就是用来具体设置路由点的。可以看到它先以connection为键,从Map里取出所有的constraint,然后把这个constraint强制为一个List,最后从List里的取出的对象再强制为一个BendPoint对象。
从上面,我们基础可以猜测,在以BendpointConnectionRouter为连接路由的情况下,我们应该怎么设置路由点了。如下:
List list = new ArrayList();
list.add(new AbsoluteBendpoint(10,30));
connection.setRoutingConstraint(list);
其中,AbsoluteBendpoint为BendPoint类的一个子类。
实现
由了上面的背景知识,要实现就不难了。不过首先我们修改一下模型。为了记录连接线的路由点,我们需要加一个属性。这里我们都以AbstractConnectionModel来做,因为我们可以假设所有的线都需要支持路由点。我假设我们都已经较熟练了,所以这次我们写得全面一些:
首先我们让我们AbstractConnectionModel继承AbstractModel,因为我们要涉及到了事件通知了。
其次,在AbstractConnectionModel里追加以下内容用以支持增加、移除和移动路由点:
public static final String P_CONSTRAINT = "p_constraint";
private List<Bendpoint> constraints = new ArrayList<Bendpoint>();
public List<Bendpoint> getConstraints() {
return constraints;
}
public void addConstraint(int index, Bendpoint bendpoint) {
if (!constraints.contains(bendpoint)) {
constraints.add(index, bendpoint);
firePropertyChange(P_CONSTRAINT, null, bendpoint);
}
}
public void setConstraint(int index, Bendpoint bendpoint) {
if (!constraints.contains(bendpoint)) {
constraints.set(index, bendpoint);
firePropertyChange(P_CONSTRAINT, null, bendpoint);
}
}
public void removeConstraint(int index) {
Bendpoint bendpoint = constraints.get(index);
constraints.remove(index);
firePropertyChange(P_CONSTRAINT, bendpoint, null);
}
有一点需要注意的:为了保证操作后的路由点显示正确,我们在操作时需要保证操作结点的顺序。所以看上面三个处理方法中,都是基于index来实现的。
接下来还是实现Policy和Command。这下我们应该可以很快就找到我们的Policy了:BendpointEditPolicy。而且我们也应该知道它应该安在哪了:AbstractConnectionModelEditPart。如下:
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE, new ConnectionBendpointEditPolicy());
最后就是实现Policy里的三个命令。这里我就不一一写了。样子都差不多。就举一个增加的例子:
public class CreateBendPointCommand extends Command {
private AbstractConnectionModel model;
private AbsoluteBendpoint point;
private int index;
public CreateBendPointCommand(AbstractConnectionModel model, Point point, int index) {
super();
this.model = model;
this.point = new AbsoluteBendpoint(point);
this.index = index;
}
@Override
public void execute() {
model.addConstraint(index,point);
}
@Override
public void undo() {
model.removeConstraint(index);
}
}
最后完成我们的Policy:
@Override
protected Command getCreateBendpointCommand(BendpointRequest request) {
CreateBendPointCommand command = new CreateBendPointCommand(
(AbstractConnectionModel) request.getSource().getModel(),request.getLocation(),
request.getIndex());
return command;
}
@Override
protected Command getDeleteBendpointCommand(BendpointRequest request) {
RemoveBendPointCommand command = new RemoveBendPointCommand(
(AbstractConnectionModel) request.getSource().getModel(),
request.getLocation(),request.getIndex());
return command;
}
@Override
protected Command getMoveBendpointCommand(BendpointRequest request) {
MoveBendPointCommand command = new MoveBendPointCommand(
(AbstractConnectionModel) request.getSource().getModel(),
request.getIndex(), request.getLocation());
return command;
}
按照背景知识里的说法,为了支持路由,我们需要给连接线设置一个ConnectionRouter。所以个性createFigure()方法如下:
@Override
protected IFigure createFigure() {
PolylineConnection connection = new PolylineConnection();
connection.setConnectionRouter(new BendpointConnectionRouter());
return connection;
}
好,我们可以试一下现在的效果: 已经可以用鼠标拖出一个一个的路由点了。只是放开后又恢复了。这次好像我们已经写了监听啊。咋回事呢?玩我的吧?发出事件写了是没错的,不过还没完成事件监听和处理。下面我们就要完成我们的事件处理。
修改AbstractConnectionModelEditPart,让它实现PropertyChangeListener监听,然后在propertyChange()方法可以这样写:
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals(AbstractConnectionModel.P_CONSTRAINT)){
refreshConnectionRoutes();
}
}
注意,这个refreshConnectionRoutes()是我自己写的。editPart本身并不带。好了,现在的任务就是怎么完成这个方法了。终于到最后一步了,死了也值了,哈哈哈哈。
我是这样完成的:
private void refreshConnectionRoutes() {
List<Bendpoint> constraints = ((AbstractConnectionModel)getModel()).getConstraints();
((PolylineConnection)getFigure()).setRoutingConstraint(constraints);
}
再试一下!!!!!唉呀,怎么回来啊,还是没出来。跟踪一下:它根本就没进我的propertyChange()方法里来嘛。知道了,是因为我没有把监听加上。在AbstractConnectionModelEditPart,追加以下内容即可(老东西,照着写就行了):
@Override
public void activate() {
super.activate();
((AbstractConnectionModel)getModel()).addPropertyChangeListener(this);
}
@Override
public void deactivate() {
((AbstractConnectionModel)getModel()).removePropertyChangeListener(this);
super.deactivate();
}
好了,这下肯定会出来了。我保证!!!效果图如下:
评论
[/color][color=darkred][/color][color=darkred][color=darkred][/color]
发表评论
-
GEF中用鼠标移动画布
2011-12-27 13:37 1357第一步 增加Palette项: moveTool = n ... -
Draw2d的ScrollPane的使用
2011-04-19 15:05 1602ScrollPane scrollpane = ne ... -
GEF的动态变化二
2011-04-13 10:47 1333之前有一篇文件介绍怎么实现GEF Editor中的图元的渐近、 ... -
(译)Eclipse Zest二
2011-01-07 15:41 19545. Zest和JFace的例子 5.1 创建工程 创建一 ... -
(译)Eclipse Zest一
2011-01-07 15:14 28831. Eclipse Zest 1.1 概述 Eclips ... -
增加GEF的动态性
2011-01-06 10:25 1780在一个GEF应用中,最常的操作是移位和缩放。移位和缩放实现本身 ... -
GEF中Palette项的属性页显示
2010-11-04 14:25 2002一般来说我们只需要在GraphicalViewer部分显示在P ... -
定制GEF的Palette
2009-11-23 16:35 2533用GEF框架实现一个Editor时,会有一个默认的palett ... -
GEF增加之连接助手二
2009-10-29 16:01 1027上一篇说过怎么实现悬浮连接助手。一直想要怎么实现悬浮连接助手。 ... -
GEF功能增强之创建助手
2009-09-28 09:09 1704用过GMF就知道,GMF默认生成的editor有一个悬浮的创建 ... -
GEF功能增强之连接助手
2009-09-10 14:45 1802GEF图形编辑器中,通常 ... -
GEF中实现“拷贝为图片”
2009-09-06 09:13 1356在一个GEF的编辑器中,编辑器上是一个个的Figure,从外观 ... -
GEF中扩大、缩小时处理编辑行为
2008-12-30 10:54 1523我们为GEF应用提供了ZoomIn和ZoomOut功能之后,在 ... -
改变GEF的一些默认行为
2008-12-29 14:12 1421一、改变Layer GEF中会根据editpart的类 ... -
GEF中一个模型的多层图的问题
2008-12-26 16:00 1642一般来说,我们在做GEF的时候,通常是一个模型对应一个图,这个 ... -
GEF中增加ContextMenu的支持
2008-12-19 22:32 2635GEF中,增加对EditPart的右键菜单的支持是很普遍的一 ... -
增加Palette的拖放支持
2008-12-19 14:08 1962默认情况下,GEF中要创建一个新的结点都是通点在Palette ... -
给GEF拖放功能
2008-07-17 10:26 1889我们知道SWT支持Native的拖放。GEF使用SWT的拖放来 ... -
修改GEF中Connection的端点
2008-07-14 16:09 1817GEF中,选中一条连接线,默认的端点是两个小黑框,如下: ... -
GEF中导视图的使用
2008-07-10 17:01 2183有时增加一个导视图能给用户很大的方便性,例如在outline视 ...
相关推荐
在GEF(Graphical Editing Framework)中,理解其工作流程对于开发图形编辑工具至关重要。GEF主要用于构建基于SWT和JFace的图形用户界面,它提供了丰富的功能来处理图形元素的绘制、操作和交互。本篇文章将深入探讨...
【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"可能更侧重于实践,提供逐步的教程和实例,帮助初学者快速上手。它可能包含一些实际的代码示例,教你如何构建一个简单的图形编辑器,例如绘制流程图或网络拓扑图。 通过学习这两份资料,你将...
然而,随着“八进制”Blog上一系列GEF教程的出现,这一状况得到了显著改善。 #### GEF框架的核心价值 GEF框架的核心价值在于它能够提供一套完整的图形编辑解决方案,包括但不限于模型管理、视图渲染、编辑操作、...
2. "GEF入门系列(一、Draw2D).doc" 可能是一个逐步的教学系列,从基础的Draw2D开始,逐步引入GEF的概念和应用。 3. "如何在Eclipse3.3.1.1中安装VE,emf,GEF插件.doc" 提供了在特定版本的Eclipse中安装相关插件的步骤...
这个入门学习例子旨在帮助初学者理解GEF的基本用法和核心概念,通过实例展示如何利用GEF实现工具栏、菜单栏、属性栏以及图形的交互功能,如移动、删除、撤销、连线等,并涵盖了大纲视图和鹰眼功能的实现。...
4. **流程设计基础**:在gef框架下进行流程设计,首先要明确流程的目标和步骤,这可能涉及到对程序逻辑的理解和拆解,将复杂的任务分解为一系列可执行的子任务。这通常需要扎实的编程基础和问题解决能力。 5. **gef...
**3gef**可能是这个系列教程的一个特定版本或者阶段,强调了对GEF的三次迭代改进或深化理解。这可能涉及到更高级的功能,如图形的动态更新、自定义手势识别或者与其他Eclipse插件的集成。 **gef_eclipse**标签表明...
这个"eclipse_gef_example.rar"压缩包提供了一系列的例子,帮助开发者更好地理解和掌握GEF框架。以下是对每个部分的详细解释: 1. **org.eclipse.gef.examples.text** 这个部分主要展示了如何在GEF环境中处理文本...
总结来说,gef工程代码是一个强大的学习资源,对于想要提升调试技能和深入理解代码运行机制的开发者来说,是不可多得的宝藏。通过深入研究和实践,你将能够掌握gef的精髓,从而在日常开发和调试工作中更加游刃有余。
### GEF(Graphical Editing Framework)入门教程知识点详解 #### 一、简介 GEF(Graphical Editing Framework),即图形编辑框架,是一种基于...希望您能够通过实践加深对GEF的理解,并成功地应用于自己的项目中。
GEF包含了一系列的类和接口,如Command、Model、View、EditPart、Figure等,它们共同构成了图形编辑的基础架构。Command代表可撤销/重做的操作,Model表示数据模型,View负责显示图形,EditPart作为模型和视图之间...
8. **手势和工具(Gesture and Tool)**:GEF定义了一系列工具,如选择工具、移动工具等,以及手势识别机制,以响应用户的交互行为。 9. **可扩展性**:GEF的设计允许通过插件机制添加新的功能或图形元素,极大地...