`
liugang594
  • 浏览: 985870 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

修改GEF中Connection的端点

    博客分类:
  • GEF
 
阅读更多

GEF中,选中一条连接线,默认的端点是两个小黑框,如下:

 

Figure 1

 

这个可用,不过终究是不太美观。这里介绍一下怎么修改这个选中的端点外观。修改后的效果如下:

 

 

Figure 2

 

首先有一点我们知道:通常要使得连线能够被选中,我们要在连接线对应的EditPart上安装以下Policy:

installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new ConnectionEndpointEditPolicy());

 

所以,我们知道,要想修改连线端点,我们需要从ConnectionEndpointEditPolicy下手。

 

ConnectionEndpointEditPolicy里有一个方法:createSelectionHandles()。这个方法就是提供端点选择的方法。其实我们在选中某个结点的时候,结点周围出现在带8个点的边框也是某个Policy提供的一些SelectionHandles。

 

所以下面我们的任务就是继承ConnectionEndpointEditPolicy,例如我们新写一个类:HomunculeConnectionEndpointPolicy,重写createSelectionHandles()方法。

 

我们看一下源码:

 

protected List createSelectionHandles() {
	List list = new ArrayList();
	list.add(new ConnectionEndHandle((ConnectionEditPart)getHost()));
	list.add(new ConnectionStartHandle((ConnectionEditPart)getHost()));
 	return list;
}

可以看到,为了修改端点的显示,我们需要提供自己的ConnectionEndHandle和ConnectionStartHandle。最简单的就是分别写两个继承这两个类的类。然后重写paintFigure(Graphics)方法。

 

不过,有点可惜的是:ConnectionEndHandle和ConnectionStartHandle都是final的,所以没法继承。所以我们需要转而继承他们的父类了。还好,这个很简单,最后的结果如下:

 

HomunculeConnectionEndpointPolicy类:

public class HomunculeConnectionEndpointPolicy extends
		ConnectionEndpointEditPolicy {
	@Override
	protected List<ConnectionHandle> createSelectionHandles() {
		List<ConnectionHandle> list = new ArrayList<ConnectionHandle>();
		list.add(new HomunculeConnectionEndHandle((ConnectionEditPart) getHost()));
		list.add(new HomunculeConnectionStartHandle((ConnectionEditPart) getHost()));
		return list;
	}
}

 HomunculeConnectionStartHandle类:

public class HomunculeConnectionStartHandle extends ConnectionHandle{

	public HomunculeConnectionStartHandle(ConnectionEditPart host) {
		setOwner(host);
		setLocator(new ConnectionLocator(getConnection(), ConnectionLocator.SOURCE));
	}
	
	/**
	 * Creates and returns a new {@link ConnectionEndpointTracker}.
	 * @return the new ConnectionEndpointTracker
	 */
	protected DragTracker createDragTracker() {
		if (isFixed()) 
			return null;
		ConnectionEndpointTracker tracker;
		tracker = new ConnectionEndpointTracker((ConnectionEditPart)getOwner());
		tracker.setCommandName(RequestConstants.REQ_RECONNECT_SOURCE);
		tracker.setDefaultCursor(getCursor());
		return tracker;
	}
	
	@Override
	public void paintFigure(Graphics g) {
		Rectangle r = getBounds();
		r.shrink(1, 1);
		try {
			g.setBackgroundColor(ColorConstants.green);
			g.fillOval(r);
			g.setForegroundColor(ColorConstants.darkBlue);
			g.drawOval(r);
		} finally {
			// We don't really own rect 'r', so fix it.
			r.expand(1, 1);
		}
	}
}

 

HomunculeConnectionEndHandle类:

public class HomunculeConnectionEndHandle extends ConnectionHandle {

	public HomunculeConnectionEndHandle(ConnectionEditPart host) {
		setOwner(host);
		setLocator(new ConnectionLocator(getConnection(), ConnectionLocator.TARGET));
	}
	
	/**
	 * Creates and returns a new {@link ConnectionEndpointTracker}.
	 * 
	 * @return the new ConnectionEndpointTracker
	 */
	protected DragTracker createDragTracker() {
		if (isFixed())
			return null;
		ConnectionEndpointTracker tracker;
		tracker = new ConnectionEndpointTracker((ConnectionEditPart) getOwner());
		tracker.setCommandName(RequestConstants.REQ_RECONNECT_TARGET);
		tracker.setDefaultCursor(getCursor());
		return tracker;
	}

	@Override
	public void paintFigure(Graphics g) {
		Rectangle r = getBounds();
		r.shrink(1, 1);
		try {
			g.setBackgroundColor(ColorConstants.green);
			g.fillOval(r);
			g.setForegroundColor(ColorConstants.darkBlue);
			g.drawOval(r);
		} finally {
			// We don't really own rect 'r', so fix it.
			r.expand(1, 1);
		}
	}

}

 

 最后就可以得到我们想要的结果。

 

多说一句:createDragTracker() 方法是用来重定向连接的!

  • 描述: default endpoint
  • 大小: 2.6 KB
  • 描述: after
  • 大小: 2.2 KB
分享到:
评论
1 楼 zhazha1984 2009-02-04  
图片呢~?~

相关推荐

    GEF中文教程+代码

    在本教程中,我们将深入探讨GEF的基本概念、设计原则以及如何使用它来开发自己的图形编辑器。 **1. GEF简介** GEF的设计目标是将图形编辑器的实现细节抽象化,让开发者能够专注于业务逻辑和模型设计,而不是底层的...

    GEF 入门版中文教程 源码

    4. **命令(Command)**:GEF中的命令模式用于封装对模型的修改操作,使得撤销/重做功能得以实现。命令对象记录了更改前后的状态,便于执行回滚或重复操作。 5. **图元(Figure)**和**绘图(Drawing)**:GEF通过SWT...

    gef 转折线的相关方法实现和 GEF的API chm 格式

    - `org.eclipse.gef.commands.Command`:命令模式在GEF中用于执行可撤销/重做的操作,如添加、删除或修改图形元素。 - `org.eclipse.gef.requests.Request`:表示用户或系统对编辑域的某种请求,如创建新对象或选择...

    自己下的GEF资源打包

    "gefpractice31.zip"则可能是包含了一个或多个实际的GEF项目实例,用户可以解压后运行,通过观察和修改代码来实践和学习GEF的实际运用技巧。这种实践性的学习方式有助于提升开发者对GEF的理解和应用能力。 "GEF-...

    GEF入门实例代码2《Eclipse插件开发》中实例

    GEF(Graphical Editing Framework)是Eclipse平台中的一个核心组件,主要用于构建图形化编辑工具。这个实例代码2是《Eclipse插件开发》教程中的一部分,旨在帮助初学者理解如何利用GEF来创建自定义的图形编辑器。在...

    GEF中属性页面的实现

    实现后的效果如图所示,满足了系统设计的需求,即点击处理器图形模型时能在属性视图中显示对应的硬件信息,同时在图形模型或属性视图中修改属性,另一端都会实时反映出变化。 在实际应用中,可以根据需求扩展属性...

    GEF入门学习例子

    在GEF中,通过实现`OutlinePage`和`StructuredSelection`可以将模型数据展示在大纲视图中。 6. **鹰眼(Eyeball)**: 鹰眼功能是一种缩略图视图,让用户能快速查看整个图形区域。在GEF中,可以通过自定义小部件并集成...

    GEF入门必读 GEF入门系列 GEF-whole-upload

    **GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的...对于希望在Java和Eclipse环境中提升图形界面开发技能的程序员来说,"GEF入门必读 GEF入门系列 GEF-whole-upload"是一个不可多得的学习资源。

    GEF简易教程-学习GEF的入门教程

    在RCP项目中,**Editor**是最常见的GEF承载对象,它继承自`EditorPart`,提供了图形修改后的自动保存机制,这是View不具备的功能。 为了构建GEF编辑器,需要创建以下三个核心组件: 1. **模型(Model)**:定义数据...

    GEF-SDK-3.6.2 jar

    GEF的引入主要是为了支持ADT中的图形化界面设计,使得开发者可以更直观地构建和修改Android应用的用户界面。 Eclipse GEF框架的核心特性包括: 1. **模型-视图-控制器(MVC)架构**:GEF遵循MVC设计模式,将数据...

    GEF快速入门教程和EMF教程

    通过此教程,读者能够理解GEF的基本架构以及如何在Eclipse RCP应用中集成GEF。 ### 前提条件 在开始之前,请确保您的开发环境符合以下要求: - **操作系统**: Windows XP (Windows 2000用户可能遇到问题,将在...

    GEF_Demo_Code20170307

    在本示例中,适配器用于扩展属性页配置,这意味着它可以将特定的视图或编辑器的属性展示在属性视图中,允许用户在运行时修改这些属性。适配器通过监听和响应对象的变化,实现了数据与视图的同步更新。 2. **在...

    Eclipse开发使用GEF和EMF(IBM 红皮书)中英文对照版

    《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...

    java开发工具插件 GEF

    5. **图元和连接(Figure and Connection)**:图元是GEF中基本的可视化元素,可以是简单的形状,也可以是复杂的组合。连接用于将图元相互连接,以表达数据间的关联。开发者可以通过继承或扩展已有的图元和连接类...

    GEF框架入门学习

    这是我自己在学习GEF的时候做的一些总结。 1、GEF中的概念比如Command,Tool,Request等等。 2、GEF中使用到的几种设计模式。 3、GEF中对鼠标键盘事件处理的机制、流程。

    GEF教程及demo源码GEF_RCP_DEMO.zip

    在本教程中,GEF_RCP_DEMO展示了如何在RCP应用中集成GEF图形编辑功能。 8. **DEMO源码分析** GEF_RCP_DEMO的源码包含了各种GEF特性的实例,如图元创建、连接线绘制、拖放操作等。通过分析这些示例代码,开发者可以...

    GEF开发指南

    同样,连线(Connection)、直接编辑(Direct Edit)、变更标记(Dirty)等更高级的功能也在指南中得到了详尽的描述。 总之,GEF开发指南是一份从基础到高级应用,系统介绍GEF框架使用方法的重要文档。它不仅对初学...

Global site tag (gtag.js) - Google Analytics