`

GEF Connection 选中后显示连线

阅读更多

关键字:GEF Connection 选中后显示连线

 

GEF(Graphics Editor Framework)是一个挺复杂的图形编辑的框架结构。基本的概念就很多,我是参考《Eclipse插件开发》这本书学习的,这本书对与GEF的内容讲解的不好。 下个星期自己把这部分的内容整理一下。

 

说说连线 后显示的问题:

第一步:

覆盖refresh()函数,不让其调用refreshSourceConnections();和refreshTargetConnections()函数。

第二步:

在editorpart中增加

installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new SelectionEditPolicy());

 的EditorPolicy()。

在SelectionEditPolicy 中实现选择时刷新连线。

public class SelectionEditPolicy extends SelectionEditPolicy {

	protected void hideSelection() {
		BlockEditpart editpart = (BlockEditpart)getHost();
		setConnectionVisible(editpart.getSourceConnections(),false,null);
		setConnectionVisible(editpart.getTargetConnections(),false,null);
	}
	
	protected void showPrimarySelection() {
		BlockEditpart editpart = (BlockEditpart)getHost();
		editpart.refreshConnections();
		setConnectionVisible(editpart.getSourceConnections(),true,ColorConstants.red);
		setConnectionVisible(editpart.getTargetConnections(),true,ColorConstants.red);
	}

	protected void showSelection() {
		BlockEditpart editpart = (BlockEditpart)getHost();
		setConnectionVisible(editpart.getSourceConnections(),true,ColorConstants.green);
		setConnectionVisible(editpart.getTargetConnections(),true,ColorConstants.green);
	}
	
	private void setConnectionVisible(List<?> Connections, boolean b, Color fg) {
		for(Object o : Connections) {
			if(o instanceof ConnectionEditPart) {
				ConnectionEditPart cep = (ConnectionEditPart)o;
				cep.setVisible(b,fg);
			}
		}
	}
}

 

这里要注意:refreshConnections中除了调用refreshSourceConnections(); refreshTargetConnections();还要手工写一个刷新连线对应的Editor,因为前面没有调用过,不然线就连不上。

	private void refreshRelateConnection() {
		Map<Object,EditPart> modelToEditPart = new HashMap<Object,EditPart>();
		List<?> editParts = this.getParent().getChildren();
		for(Object o : editParts) {
			EditPart editPart = (EditPart)o;
			if(!(editPart instanceof BlockEditpart)) {
				continue;
			}
			modelToEditPart.put(editPart.getModel(), editPart);
		}
		
		List<?> ee = getSourceConnections();
		for (int i = 0; i < ee.size(); i++) {
			ConnectionModel c = getModelSourceConnections().get(i);
			BlockEditpart e = (BlockEditpart)modelToEditPart.get(c.getTarget());
			ConnectionEditPart cep = (ConnectionEditPart)ee.get(i);
			e.addTargetConnection(cep, 0);
		}
		
		ee = getTargetConnections();
		for (int i = 0; i < ee.size(); i++) {
			ConnectionModel c = getModelTargetConnections().get(i);
			BlockEditpart e = (BlockEditpart)modelToEditPart.get(c.getSource());
			ConnectionEditPart cep = (ConnectionEditPart)ee.get(i);
			e.addSourceConnection(cep, 0);
		}
	}

 刷新对应连线,有连个注意点,第一,如何得到对应Node的Editorpart,这个采用了最蠢的方法,遍历所有的Editorparts,不知道有没有更好的方法;第二,不能用到的Editorpart直接调用refreshSourceConnections(); refreshTargetConnections();,因为这样使用的话,原始Node的所有连线是画好了,相关Node的连线又没有画好。

办法有点儿蠢,不过效果达到了。

分享到:
评论

相关推荐

    RCP 视图显示GEF图

    用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);

    gef布局显示学习

    Gef布局显示学习是针对Linux系统调试工具Gef(GDB Enhanced Features)的一种深入探究,它主要涉及如何在GDB(GNU Debugger)中有效地利用Gef的各种功能来优化代码调试过程。Gef是一款强大的GDB插件,提供了丰富的...

    悬空连线相关类的实现

    在图形编辑框架(Graphical Editing Framework,简称GEF)中,悬空连线是一种常见的功能,它允许用户在图形画布上创建未连接到任何端点的连接线,以表示潜在的连接关系。这类连线通常在用户尝试建立节点之间的连接时...

    自己下的GEF资源打包

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

    GEF 开发简单示例

    这是我参考了一些其他资料,自己写的一个GEF示例程序。 在这个demo中你可以看到以下的功能: 1. 往画布上添加多种节点 2. 节点之间的连线 3. 节点内容的编辑功能 4. 删除连线 5. 删除节点 6. 对节点的拖动以改变...

    GEF入门学习例子

    这个入门学习例子旨在帮助初学者理解GEF的基本用法和核心概念,通过实例展示如何利用GEF实现工具栏、菜单栏、属性栏以及图形的交互功能,如移动、删除、撤销、连线等,并涵盖了大纲视图和鹰眼功能的实现。...

    一个GEF的简单例子

    6. **Connection Manager(连接管理器)**: 用于处理图形元素之间的连线,支持自动布局和调整。 **GEF的工作流程** 1. 用户在图形界面上进行操作,例如点击或拖动。 2. 编辑部件(Edit Part)接收到这些事件并进行...

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

    GEF插件开发涉及创建模型、视图和控制器(MVC)组件,其中模型定义数据结构,视图负责显示,而控制器处理用户的交互。开发者需要理解Eclipse插件开发的基本流程,包括创建插件项目、定义扩展点、编写实现类等步骤。 ...

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

    5. 更新视图:完成转折线的修改后,需要调用EditPart的refreshVisuals方法来更新图形的显示。 接下来,我们讨论GEF的API。GEF提供了丰富的API接口,包括图形对象的创建、操作、布局以及事件处理等。一些关键的API...

    GEF开发指南

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

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

    虽然两者都可以用来显示GEF图形,但**Editor**与**View**存在本质区别: - **Editor**提供文件保存功能,适用于需要持久化数据的场景。 - **View**主要用于展示数据,不涉及数据保存,适用于动态数据展示或监控界面...

    eclipse3.4的可视化开发GEF

    3. **GraphicalViewer**:作为图形视图的容器,负责显示模型数据。 4. **Figure**:表示图形元素,如矩形、圆形等。 5. **ConnectionFigure**:用于绘制和管理连接线。 6. **EditPolicy**:定义特定编辑行为,如选择...

    GEF连接线Node之间连接

    `GEF`提供了丰富的功能,允许开发人员创建复杂的图形编辑器,包括节点(Node)、连接线(Connection)等元素,使用户可以直观地操作和表示数据。 标题"GEF连接线Node之间连接"涉及到的知识点主要集中在`GEF`框架中...

    GEF-SDK-3.7.0

    1. **模型-视图-控制器(MVC)架构**:GEF遵循MVC设计模式,分离了数据模型、视图显示和用户交互控制,使得代码组织清晰,易于维护。 2. **图形绘制与布局**:GEF提供了一套图形绘制API,支持基本形状、连接线、...

    GEF教程和demo源码

    4. **绘图和布局**:源码中会有绘制图形元素和设置布局的代码,比如在画布上定位和显示“Hello”。 5. **事件监听**:源码可能会添加事件监听器,以便当用户与图形元素交互时,能够响应并更新模型。 6. **运行与...

    RCP与GEF课件,介绍RCP和GEF各组成部分和工作原理

    6. **Property and Selection Services**:属性服务和选择服务允许不同组件之间共享信息和协调行为,如传递当前选中的对象。 **GEF(Graphical Editing Framework)** 是Eclipse中的一个图形编辑框架,它为开发图形...

    GEF实现拷贝粘贴

    标题“GEF实现拷贝粘贴”涉及到的是在软件开发中使用Graphical Editing Framework(GEF)进行图形界面编辑时,如何实现复制和粘贴功能的技术。GEF是Eclipse平台下用于构建图形化编辑器的框架,它提供了一套完整的...

    GEF锚点鼠标定位

    - **刷新视图**:更新锚点位置后,需要通知GEF视图进行重绘,以反映变化。 5. **代码示例**: 在Java中,你可以创建一个类,如`MouseTrackingAnchor`,并在其中实现`mouseMoved`方法,根据鼠标位置更新锚点的位置...

    GEF快速入门教程和EMF教程

    - 添加依赖后,项目的构建路径将包含GEF库,从而可以在项目中使用GEF功能。 ### 创建Editor 接下来,我们将创建一个Editor,这是GEF应用中最核心的部分之一。通常情况下,GEF会集成到Editor中而非View中,这是...

Global site tag (gtag.js) - Google Analytics