`
winse
  • 浏览: 94569 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

GMF编辑器中,图形可以放大不能缩小

 
阅读更多

同事和我做同一件事情,但是我弄的总有个问题。

对比了我们各自写的文件,在表面上完全没有那里存在问题。

 

在前段的时间中也遇到相应的问题,原来是加上一个布局就可以了。

 

setLayoutManager(new ConstrainedToolbarLayout());

 

再次遇到一样的问题,想查查到底是什么问题。经过对比使用布局和不使用的调试结果后。

大概问题如下:

 

GEF在用户操作会提供一个“鬼影”的提示。获得的FeedBack的大小由操作的图形的MinSize和操作后的Bounds决定。

 

org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableEditPolicyEx.showChangeBoundsFeedback(ChangeBoundsRequest)
    protected void showChangeBoundsFeedback(ChangeBoundsRequest request) {
        IFigure feedback = getDragSourceFeedbackFigure();
        // 获得操作后的大小
        PrecisionRectangle rect = new PrecisionRectangle(getInitialFeedbackBounds().getCopy());
        getHostFigure().translateToAbsolute(rect);
        rect.translate(request.getMoveDelta());
        rect.resize(request.getSizeDelta());
        
        IFigure f = getHostFigure();
        // 最小的大小
        Dimension min = f.getMinimumSize().getCopy();
        Dimension max = f.getMaximumSize().getCopy();
        IMapMode mmode = MapModeUtil.getMapMode(f);
        min.height = mmode.LPtoDP(min.height);
        min.width = mmode.LPtoDP(min.width);
        max.height = mmode.LPtoDP(max.height);
        max.width = mmode.LPtoDP(max.width);
        
        if (min.width>rect.width)
            rect.width = min.width;
        else if (max.width < rect.width)
            rect.width = max.width;
        
        if (min.height>rect.height)
            rect.height = min.height;
        else if (max.height < rect.height)
            rect.height = max.height;
        
        feedback.translateToRelative(rect);
        feedback.setBounds(rect);
    }

 

而Figure的getMinimumSize()方法中,当用户没有直接设置minSize,又没有设置布局管理器LayoutManager的话,会返回preferredSize。最终返回了当前图形Figure的size/bounds。

 

	public final Dimension getMinimumSize() {
		return getMinimumSize(-1, -1);
	}

	public Dimension getMinimumSize(int wHint, int hHint) {
		if (minSize != null)
			return minSize;
		if (getLayoutManager() != null) {
			Dimension d = getLayoutManager().getMinimumSize(this, wHint, hHint);
			if (d != null)
				return d;
		}
		return getPreferredSize(wHint, hHint);
	}

 

	public final Dimension getPreferredSize() {
		return getPreferredSize(-1, -1);
	}

	public Dimension getPreferredSize(int wHint, int hHint) {
		if (prefSize != null)
			return prefSize;
		if (getLayoutManager() != null) {
			Dimension d = getLayoutManager().getPreferredSize(this, wHint,
					hHint);
			if (d != null)
				return d;
		}
		return getSize();
	}

 

这样用户看到的看到的FeedBack就是当前大小,导致出现不能缩小的窘境/囧。

 

<------------------------------------->

 

2/ 在准备写的时刻又遇到了一个问题,既然我们看到的FeedBack是控制了,但是FeedBack是在request已经生成后才呈现给用户看的,那么又是怎样反过来改变Request的呢?

 

其实,GMF并没有再次处理Request,比minSize小,照样修改模型的数据。

 

3/ 只是在重绘的时刻,通过layoutmanager#layout(),重新计算孩子的大小,而layout()则会调用min,max,perfectSize来重新设置Bounds。

 

org.eclipse.gmf.runtime.diagram.ui.layout.FreeFormLayoutEx.layout(IFigure)

 

 

 

 

分享到:
评论

相关推荐

    图形建模框架GMF综述

    然而,这些工具往往不能完全满足特定领域的个性化需求,而且自行开发新的建模工具不仅成本高昂,还需要深厚的专业知识。在此背景下,图形建模框架GMF的出现为解决这些问题提供了一个理想的方案。 #### GMF框架概述 ...

    gmf 1.7 最新版的gmf

    2. **图形编辑器生成**:基于定义的模型,GMF能自动生成图形编辑器的代码,包括图形的绘制、布局以及与模型数据的交互。 3. **图元工厂**:GMF提供图元工厂,用于创建和管理图形元素,包括形状、连接线等,这些元素...

    GMF EMF

    - **RCP Integration**:GMF与Eclipse Rich Client Platform (RCP) 的集成,使得编辑器可以在RCP应用程序中运行。 3. **GMF工作流程**: - 创建EMF模型:首先,你需要定义数据结构,这通常通过Ecore模型完成。 -...

    15 分钟学会 Eclipse GMF

    GMF生成的编辑器作为Eclipse插件运行,可以无缝集成到Eclipse IDE中,与其他Eclipse功能协同工作。 10. **调试和测试**: 使用Eclipse的调试工具,可以对生成的编辑器进行调试,确保其正确性和性能。 学习...

    GMF数据表建模例子

    GMF简化了创建自定义图形编辑器的过程,通过生成代码和编辑器组件,使得开发者可以专注于业务逻辑而不是底层实现。 2. **EMF和GEF**:EMF是Eclipse用于构建模型的基础,它提供了一种在Java中表示和操作结构化数据的...

    GMF实例解析.pdf

    GMF,全称是Graphical Modeling Framework,是Eclipse建模项目中的一个重要组成部分,它建立在GEF(Graphical Editor Framework)和EMF(Eclipse Modeling Framework)之上,为开发基于图形界面的编辑器提供了一种更...

    eclipse gef ve gmf

    GMF的强项在于它的自动化能力,可以自动生成编辑器的大部分代码,包括图形表示、编辑操作以及与模型的交互。 这三者的关系是:GEF提供基础的图形编辑支持,VE是在GEF基础上构建的一个特定领域的可视化编辑器,主要...

    GMF教程.doc

    【GMF教程】GMF(Graphics Modeling Framework)是Eclipse平台下的一个图形...通过这个教程,读者可以了解到如何利用GMF构建一个简单的Mindmap图形编辑器,这对于理解GMF框架和开发自定义图形工具具有重要的实践意义。

    Eclipse插件 GMF

    在Eclipse插件GMF的帮助下,你可以构建出专业级的模型编辑器,支持拖放操作、自动布局、以及各种交互功能。 GMF的核心理念是基于模型驱动的开发(Model Driven Development, MDD)。在这个框架下,开发者首先定义一...

    GMF实例解析(PDF版)

    通过Taipan实例的深度分析,我们不仅能够深入了解GMF的工作原理,还能学习如何充分利用其功能来创建复杂且用户友好的图形化编辑器。对于那些致力于图形化应用程序开发的工程师而言,掌握GMF无疑是一条通往成功的捷径...

    gmf-runtime-2.1.2.zip

    开发者可以通过导入模型文件,然后利用GMF生成对应的图形编辑器,实现模型的可视化编辑。 总结一下,"gmf-runtime-2.1.2.zip"是Eclipse图形化开发插件GMF的运行时组件,主要用于创建和编辑基于模型的图形用户界面。...

    org.eclipse.gmf.rar

    《深入解析Eclipse GMF RAR技术》 在软件开发领域,Eclipse是一个广泛使用的集成开发环境(IDE...在实际项目中,通过熟练运用GMF RAR,开发者能够快速构建出符合业务需求的图形化编辑器,提高开发效率,降低维护成本。

    GMF Tutorial中文版

    GMF通过一个通用的方式将这两者结合,使得开发者能更高效地创建图形化应用。GMF区分了"toolsmith"(使用GMF构建插件的开发者)和"user"(使用这些插件的开发者),并强调在透视图中,GMF应尽可能隐藏内部模型的复杂...

    一个简单的GMF实例

    在IT领域,GMF(Graphical Modeling Framework)是Eclipse项目的一部分,主要用于创建图形化编辑器。这个“一个简单的GMF实例”可能是一个教程或者示例项目,旨在帮助开发者理解如何使用GMF来构建自己的图形用户界面...

    GMF Tourial中文版(一)

    - 通过学习该教程,开发者不仅可以掌握如何使用GMF构建高效、灵活的图形化编辑器,还能了解到如何优化Eclipse的配置以适应不同的硬件环境。 - 对于想要深入研究Eclipse平台下的图形化应用开发的读者来说,**GMF ...

    eclipse GMF 制作简单工作流流程设计器(3)

    GMF是Eclipse平台上的一个开源项目,它提供了一种方式来创建图形编辑器,特别适用于创建建模和设计工具。在这个教程中,我们可能将深入学习如何通过GMF构建一个用于绘制和管理工作流的用户界面。 描述虽然为空,但...

    GMF介绍以及使用手册.rar

    在实践中,GMF的应用非常广泛,它可以用于构建UML模型编辑器、数据库设计工具、网络配置界面等各种图形化的应用程序。由于GMF是开源的,并且与Java紧密集成,因此它为开发者提供了丰富的API和社区支持。 总结来说,...

Global site tag (gtag.js) - Google Analytics