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

GEF画布的滚动条位移计算

阅读更多

     用GEF做流程图编辑器时,当流程图比较复杂,单个屏幕无法完全显示的时候就会出现滚动条。当有滚动条的时候,一些图形控件的位置计算就会出现相应的偏差。很明显的一个例子就是直接在图形上进行编辑时出现的那个输入框,gef里叫做NodeDirectEditCell。
如下图所示:



 

编辑框的弹出位置并没有落在testNode上,它的偏移距离恰好是滚动条的滚动位移。这在JavaScript里是很好解决的,在gef里也很容易,只是网上资料繁多一直都没有找到。当初看JBPM可视化插件源码的时候,想看看它是如何找到这个偏移量的,可是它并没有解决这个问题,不知道新的版本中有没有解决。没办法,只有自己一点一点找了。
这里关键的是要实现org.eclipse.gef.tools.CellEditorLocator这个借口,在relocate方法里计算出真实位置。废话少说直接上代码:

public class NodeCellEditorLocator implements CellEditorLocator {
	private NodeFigure nodeFigure;

	/**
	 * Creates a new ActivityCellEditorLocator for the given Label
	 * 
	 * @param nodeFigure
	 *            the Label
	 */
	public NodeCellEditorLocator(NodeFigure nodeFigure) {
		this.nodeFigure = nodeFigure;	//得到当前编辑的figure
	}

	/**
	 * @see CellEditorLocator#relocate(org.eclipse.jface.viewers.CellEditor)
	 */
	public void relocate(CellEditor celleditor) {
		Text text = (Text) celleditor.getControl();
		int scrollWidth = 0;//东西偏移量
		int scrollHeight = 0;//南北偏移量

		FigureCanvas canvas = (FigureCanvas) text.getParent(); // 得到滚动区域的画布
		scrollWidth = canvas.getViewport().getHorizontalRangeModel().getValue();
		scrollHeight = canvas.getViewport().getVerticalRangeModel().getValue();

		Point pref = text.computeSize(SWT.DEFAULT, SWT.DEFAULT);
		Rectangle rect = this.nodeFigure.getTextBounds();	//得到覆盖的文本label
		text.setBounds(rect.x - 1 - scrollWidth, rect.y - 1 - scrollHeight,
				pref.x + 1, pref.y + 1);

	}

}
 

最终效果图:



 

PS:前几天面试时被问到一个问题:当流程图比较复杂时,一个屏幕显示不下,用什么方法能够得到更好的用户操作?我回答说:可以考虑折叠功能,用户可以把嵌套的节点折叠起来。感觉和面试官预期的答案不是这个,后来想想整个画布的zoom in/zoom out更好一些.

  • 大小: 5.5 KB
  • 大小: 4.2 KB
1
0
分享到:
评论
2 楼 wangacidlemon 2012-05-18  
我在用GEF时出现这种情况,当鼠标选中某个图形时,图形居然往上移动。请问您有什么建议吗?
1 楼 AquariusM 2011-08-22  
相当不错
int scrollWidth = 0;//东西偏移量  
        int scrollHeight = 0;//南北偏移量  
  
        FigureCanvas canvas = (FigureCanvas) text.getParent(); // 得到滚动区域的画布  
        scrollWidth = canvas.getViewport().getHorizontalRangeModel().getValue();  
        scrollHeight = canvas.getViewport().getVerticalRangeModel().getValue(); 

这段代码帮我解决了问题
Thangk You!

相关推荐

    自己下的GEF资源打包

    标题中的“GEF资源打包”指的是一个集合了关于GEF(Graph Edit Framework)的各种学习资料的压缩文件。这个资源包可能包含了对理解、学习和使用GEF非常有帮助的材料。描述进一步说明了这个包中包含的具体内容,如...

    GEF教程和demo源码

    2. **图形表示**:GEF允许开发者定义图形元素的外观,包括形状、线条、颜色等,以及它们如何在画布上布局和交互。 3. **手势处理**:GEF提供了一套标准的手势处理机制,如拖放、单击、双击等,使得图形对象可以响应...

    GEF入门学习例子

    GEF中的视图由`GraphicalViewer`类实现,它管理着画布上的所有图形元素。 3. **编辑器(Editor)**: 编辑器是Eclipse插件开发中的一个关键组件,它提供了对模型的编辑功能。GEF编辑器通常基于`...

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

    Gef,全称Graphical Editing Framework,是Eclipse项目的一部分,是一个用于构建图形编辑框架的开源库,主要用于开发基于Swing或SWT的图形用户界面应用。这个框架支持模型驱动的编辑环境,允许开发者创建复杂的图形...

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

    **GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台上广泛使用,特别是在开发复杂的图形用户界面和工具时。本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF...

    GEF 开发简单示例

    1. 往画布上添加多种节点 2. 节点之间的连线 3. 节点内容的编辑功能 4. 删除连线 5. 删除节点 6. 对节点的拖动以改变位置 运行这个例子的方法: 0. 必须要有一个Eclipse RCP的开发环境 1. 在你的Eclipse中要有GEF, ...

    GEF学习资料.zip

    2. **视图(View)**:视图是模型的可视化表示,由GEF提供的画布(Canvas)和图形元素(如线条、形状等)构成。视图根据模型的变化实时更新,保持模型与视图的一致性。 3. **控制器(Controller)**:控制器处理...

    GEF连接线Node之间连接

    6. **布局和约束**:为了保持画布的整洁和合理布局,`GEF`支持多种布局策略,如树形布局、网格布局等。同时,还可以为节点和连接线设置约束条件,限制它们的移动范围和方向。 7. **FecatGEF10**:这个文件名可能是...

    GEF锚点鼠标定位

    在图形编辑框架(GEF,Graphical Editing Framework)中,锚点(Anchor)是一个关键概念,它是连接模型元素之间的连接线在元素上的固定点。在GEF中,锚点的定位直接影响到连接线的形状和行为,特别是当用户通过鼠标...

    GEF-ALL-3.7+GEF-ALL-3.8+GEF_Draw2d学习资料

    【GEF-ALL-3.7+GEF-ALL-3.8+GEF_Draw2d学习资料】是一份综合性的资源包,包含了GEF(Graphical Editing Framework)的3.7和3.8版本以及与其相关的Draw2D库的学习材料。GEF是Eclipse平台上用于构建图形化编辑器框架的...

    GEF理解系列三

    在GEF(Graphical Editing Framework)中,理解其工作流程对于开发图形编辑工具至关重要。GEF主要用于构建基于SWT和JFace的图形用户界面,它提供了丰富的功能来处理图形元素的绘制、操作和交互。本篇文章将深入探讨...

    GEF Example Source Code

    **GEF(Graphical Editing Framework)** 是一个用于构建图形编辑工具的开源框架,它为开发人员提供了一套全面的库和工具,用于创建基于Eclipse的富客户端平台(RCP)的应用程序,特别是那些涉及图形用户界面(GUI)...

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

    ### GEF简易教程知识点详解 #### 一、GEF简介与环境配置 **GEF**,全称为**Graphical Editing Framework**,是Eclipse平台上用于创建复杂图形编辑器的框架。它提供了一套完整的工具集,使开发者能够构建具有图形化...

    GEF-SDK-3.6.2 jar

    《GEF-SDK-3.6.2 jar:Eclipse GEF框架详解及在Android ADT中的应用》 GEF(Graphical Editing Framework)是Eclipse项目中的一个重要组成部分,它为开发图形化编辑器提供了强大的支持。在标题“GEF-SDK-3.6.2 jar...

    Eclipse的GEF学习

    ### Eclipse的GEF框架深入解析 #### 一、GEF框架概述 GEF,全称为Graphical Editor Framework,是Eclipse平台下的一款图形编辑框架,主要用于构建图形化编辑器,如流程设计器、UML类图编辑器等。GEF遵循经典的MVC...

    界面设计GEF应用实例

    首先,基础例子可能包括创建一个基本的画布,展示如何定义图形元素,如线条和形状,并且实现它们在画布上的绘制。接下来的例子可能涉及图形元素的拖放操作、连接线的动态连接、以及图形的属性编辑等。更高级的例子...

    GEF原理的详细介绍+程序实例和程序源码

    **GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台中被广泛使用。GEF提供了一套全面的API和模型,帮助开发者快速构建可定制的、交互式的图形用户界面。该框架的核心...

    eclipse gef插件

    GEF(Graphical Editing Framework)是Eclipse平台中的一个核心组件,主要用于创建图形化编辑器。这个插件极大地扩展了Eclipse的功能,允许开发者构建复杂的图形用户界面(GUI)应用,特别是对于那些需要可视化表示...

    GEF入门系列

    - **Part层**:包含图形编辑器的顶级容器,如画布(Canvas)。 3. **GEF开发流程** - **定义模型**:首先需要定义数据模型,通常使用Eclipse的EMF(Eclipse Modeling Framework)来实现。 - **创建EditParts**:...

Global site tag (gtag.js) - Google Analytics