`
lgylym
  • 浏览: 54011 次
  • 性别: Icon_minigender_1
  • 来自: Athens
文章分类
社区版块
存档分类
最新评论

一个简单的GMF实例

阅读更多

接触GMF几个月了,虽然还是比较迷糊,不过也做了点东西。这篇文章把前几天做的一个小东西分享一下,希望能对后来者有帮助。本文借鉴了中文英文各种资源,就不一一引用了(因为我实在是记不住了)。。。

上周从实验室接到这样一个需求:一个RCP欢迎界面,展示了整个大厅的所有桌子,当客人通过前台的时候刷卡(RFID),系统中显示客人的身份并且在相应的桌子号上进行提示。

示意图如下:


当客人到来时,文字区变为客人姓名,相应桌子闪烁:


那么除了进行建模及生成代码外,我需要解决一下几个问题:

1.添加背景及文字

2.使节点变色及闪烁

3.包装代码

下面进行详细说明。

 

1. 建模

本例子建模非常简单,其实只需要map和桌子两类实体就可以了。为了完整,我创建了以下实体:


接着按照步骤生成代码,这里把node的形状改为了圆形:


2.修改代码之背景

本示例中所谓的背景就是编辑器的背景,所以要进入编辑器的定义文件(HallDiagramEditor.java)中修改。修改其中的configureGraphicalViewer()函数。得到层以后插入背景层和文字层。这段代码如果我没记错的话来自八进制,感谢。

 

	protected void configureGraphicalViewer() {
		super.configureGraphicalViewer();
		DiagramEditorContextMenuProvider provider = new DiagramEditorContextMenuProvider(
				this, getDiagramGraphicalViewer());
		getDiagramGraphicalViewer().setContextMenu(provider);
		getSite().registerContextMenu(ActionIds.DIAGRAM_EDITOR_CONTEXT_MENU,
				provider, getDiagramGraphicalViewer());
                
		DiagramRootEditPart root = (DiagramRootEditPart) getDiagramGraphicalViewer()
				.getRootEditPart();
		LayeredPane printableLayers = (LayeredPane) root
				.getLayer(LayerConstants.PRINTABLE_LAYERS);
		BackgroundLayer backgroundLayer = new BackgroundLayer();
		TextLayer textLayer = new TextLayer();
		printableLayers.addLayerBefore(backgroundLayer,
				BackgroundLayer.BACKGROUND_LAYER, LayerConstants.PRIMARY_LAYER);
		printableLayers.addLayerBefore(textLayer, TextLayer.TEXT_LAYER,
				LayerConstants.PRIMARY_LAYER);
	}

 

是的,在这里插入的背景层和文字层我也自己定义了一下,主要是为了在以后想要修改的时候用着比较方便。文字层定义文字的内容和显示方式,并提供更改内容的方法。

public class TextLayer extends FreeformLayer {
	
	
	public static final String TEXT_LAYER = "Text Layer";
	
	public static final String welcomeText = "Welcome!";
	private String textContent = welcomeText;
	public TextLayer() {
		setOpaque(true);
	}
	protected void paintFigure(Graphics graphics) {
		if(isOpaque()) {
			graphics.setForegroundColor(ColorConstants.black);
			Display display = PlatformUI.getWorkbench().getDisplay();
			FontRegistry fontRegistry = new FontRegistry(display);
			fontRegistry.put("welcometext", new FontData[]{new FontData("Times New Roman", 20, SWT.BOLD)} );
			graphics.setFont(fontRegistry.get("welcometext"));
			
			graphics.drawText(textContent, 30, 100);			
		}
	}	
	public void setText(String s) {
		textContent = s;
		repaint();
	}	
}

 背景层读入背景图片,注意这里用到了一个在workspace中通过相关路径搜索文件的小技巧(来自于某篇博客)。

public class BackgroundLayer extends FreeformLayer {
	public static final String BACKGROUND_LAYER = "Background Layer";
	
	public BackgroundLayer() {
		setOpaque(true);
		findImage("content/Grand_Ballroom_floor_planV2.JPG");
	}
	
	@Override
	protected void paintFigure(Graphics graphics) {
		if(isOpaque()) {
			graphics.setForegroundColor(ColorConstants.white);
			graphics.setBackgroundColor(ColorConstants.lightBlue);
			graphics.fillGradient(getBounds(), true);
			graphics.drawImage(
						new Image(null, imagePath), 
						new Point(30,150));			
		}
	}
	private void findImage(String filePath){
		Bundle bundle = HallDiagramEditorPlugin.getInstance().getBundle();
		Path path = new Path("content/Grand_Ballroom_floor_planV2.JPG");
		URL url = FileLocator.find(bundle, path, Collections.EMPTY_MAP);
		
		try {
			URL fileUrl = FileLocator.toFileURL(url);
			imagePath = fileUrl.getPath();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}			
	}
	private static String imagePath;
}

 至此,打开编辑器时,已经可以显示出背景和文字了,通过获取text layer后可以修改文字的内容。

3.修改代码之节点

节点的闪烁问题还是花了一些时间的,最终的解决方法如下:

修改节点对应的图形类 TableEditPart.java。通过修改createNodeFigure()函数,将其设置为初始不可见,这样在每个桌子上会有一个不可见的圆形节点盖在上面。

增加blink函数,使其闪烁起来,函数的输入为桌子号,客人名字以及希望闪烁的时间。

	/*
	 * become a yellow eclipse to remind the background table number periodically
	 */
	public void blink(int tableNumber, String guestName, final int lastTime) {
		//set yellow eclipse
		primaryShape
				.setForegroundColor(org.eclipse.draw2d.ColorConstants.orange);
		primaryShape
				.setBackgroundColor(org.eclipse.draw2d.ColorConstants.orange);
		//set text area
		//1.get editor
		DiagramRootEditPart root = (DiagramRootEditPart) getRoot();
		tl = (TextLayer) root.getLayer("Text Layer");
	    tl.setText("Hello " + guestName +", your table number is " + tableNumber);
		
	    new Runnable() {
			int i = 0;
			public void run() {
				if (i >= (lastTime/1000)) {
					primaryShape.setVisible(false);
					//set text area again
					tl.setText(TextLayer.welcomeText);
					return;
				} else if (i % 2 == 0) {
					primaryShape.setVisible(false);
				} else {
					primaryShape.setVisible(true);
				}
				//period is 1 second
				Display.getDefault().timerExec(1000, this);
				i++;
			}
		}.run();
	}

 3.菜单及命令

在测试阶段我为本程序设置了两个命令 show view和blink table,前者读取用户指定的map文件建立编辑区,后者闪烁用户指定的桌子。在真正运行时会调用数据库等。将本程序作为插件运行在另一个主程序中工作正常。

 

4.代码说明及下载

我做出修改的程序分别为:

hall.diagram.edit.commands包中:

BlinkTable.java

OpenGuestViewHandler.java

SaveDiagram.java

 

hall.diagram.edit.layer包中:

BackgroundLayer.java

TextLayer.java

 

hall.diagram.edit.parts包中:

TableEditPart.java

 

hall.diagram.part包中:

HallDiagramEditor.java

 

三个项目已打包为gmf_lgylym.zip

  • 大小: 78 KB
  • 大小: 80.1 KB
  • 大小: 9.3 KB
  • 大小: 26.9 KB
分享到:
评论

相关推荐

    GMF实例解析.pdf

    【GMF实例解析】 GMF,全称是Graphical Modeling Framework,是Eclipse建模项目中的一个重要组成部分,它建立在GEF(Graphical Editor Framework)和EMF(Eclipse Modeling Framework)之上,为开发基于图形界面的...

    GMF实例解析(PDF版)

    ### GMF实例解析:Taipan案例深度剖析 #### 前言:GMF与图形化编辑器的革新 在IT领域,特别是软件工程中,图形化编辑器的开发一直是复杂且具有挑战性的任务。传统的图形编辑器开发往往依赖于MVC(Model-View-...

    GMF教程.doc

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

    GMF Tutorial中文版

    【GMF Tutorial中文版】是一套面向初学者的Eclipse GMF(Graphical ...通过实例和详细的解释,教程不仅提供了理论知识,还提供了实践指导,对于想要涉足Eclipse建模领域的开发者来说,这是一个不可多得的学习资源。

    GMF Tourial中文版(一)

    - **EMF**是一个用于构建模型驱动的应用程序的基础框架,支持模型的定义、实例化以及持久化等操作。 - **GEF**则专注于提供图形用户界面方面的支持,如图形编辑器、布局管理等。 #### 三、案例应用——Mindmap - 本...

    GMF开发FSM的完整的例子

    本文档将通过一个详细的案例来介绍如何使用GMF来开发一个FSM(Finite State Machine,有限状态机)图形编辑器,从而教会读者如何为自己定制化的建模工具开发图形界面。 #### 了解 GMF 的机制与流程 在深入学习如何...

    15 分钟学会 Eclipse GMF

    Eclipse GMF(Graphical Modeling Framework)是Eclipse基金会推出的一个开源工具,它为开发基于模型的图形用户界面(GUI)提供了强大的支持。GMF允许开发者创建复杂的图形编辑器,这些编辑器能够以图形方式表示特定...

    gmf例子

    一个简单的GMF例子可能是创建一个地图编辑器,用户可以在地图上添加点、线、面等地理对象,编辑它们的属性,如颜色、大小、标签等。同时,用户还可以通过图层控制来选择显示哪些数据,以及通过缩放和平移操作来查看...

    GMF

    GMF可以是自定义的一个功能强大的工具,帮助程序员进行批量操作,提高代码的效率和可读性。例如,你可以使用内置的`map()`函数来实现这个目的: ```python def square(x): return x ** 2 numbers = [1, 2, 3, 4, ...

    gmf mvc editpolicy

    在GMF中,EditPolicy是MVC模式的一个扩展,它定义了特定图形元素的行为和编辑策略。EditPolicy是控制器的一部分,为视图提供了一种方式来响应用户的操作。它包含一系列编辑操作,如拖放、剪切、复制、粘贴等,这些...

    NHibernate入门实例

    NHibernate 是一个强大的开源对象关系映射(ORM)框架,用于.NET环境,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式处理数据库事务。在这个“NHibernate入门实例”中,我们将探讨如何在Visual ...

    GMF_Shell:一个简单的 Shell 学习

    【GMF_Shell:一个简单的 Shell 学习】 在IT领域,Shell是一个极其重要的工具,尤其对于系统管理员和开发者来说,它提供了与操作系统交互的命令行界面。GMF_Shell项目是一个面向初学者的简单Shell实现,旨在帮助用户...

    taipan源码及学习资料

    总之,"taipan源码及学习资料"为初学者提供了一个很好的起点,通过这个实例,你可以深入了解GMF和EMF的使用,进而掌握模型驱动开发的核心技术。同时,不断实践和探索,将有助于你在图形化建模领域更进一步。

    Eclipse Modeling Project(A Domain-Specific Language Toolkit)

    Eclipse Modeling Framework (EMF) 是一个用于创建模型驱动软件开发环境的框架。它提供了用于定义和操作数据模型的强大API,支持模型实例、模型编辑器以及模型到模型和模型到文本转换等特性。EMF通过提供一套完整的...

    GEF初学者开发样例

    通用图形编辑框架(Generic Edit Framework,简称GEF)是Eclipse平台下的一个开源项目,主要用于构建图形用户界面(GUI),尤其是图形编辑工具。GEF提供了一套完整的框架,使得开发者能够方便地创建出交互式的、可...

    gef小例子(含文档)

    而GMF(Graphical Modeling Framework)是EMF的一个扩展,专门用于创建图形化的编辑器,它可以将EMF模型映射到图形元素,使得用户可以通过拖拽和放置操作来编辑模型。 在这个“gef小例子”中,可能包含了如何使用...

    GME-AllLesson.pdf

    元建模是一种建立领域模型的元模型的过程,模型驱动架构(Model Driven Architecture,MDA)是模型驱动领域的一个核心概念,它将软件开发的重心从代码转移到了模型上,强调利用模型来描述系统的设计和功能,从而实现...

    emf-runtime-2.9.2.zip

    EMF(Eclipse Modeling Framework)是Eclipse基金会开发的一个开源框架,主要用于构建基于模型的应用程序。这个"emf-runtime-2.9.2.zip"压缩包包含的是EMF运行时环境的版本2.9.2,它是Eclipse IDE的一个重要组成部分...

Global site tag (gtag.js) - Google Analytics