GMF使用自定义图像搭建图形化建模工具

来源:互联网 发布:订货会软件 编辑:程序博客网 时间:2024/06/01 08:06

在利用GMF开发的图形化建模环境中使用直观的图像标识建模元素能够更有效地支持用户进行建模。下面介绍导入外部图片作为元素标识的方法。

首先,在GMF所在工作空间中创建一个Plugin-in项目。

Plugin项目向导

然后在该项目的src下的与Plugin-in项目同名的包下创建两个java文件,分别为:

/*AbstractElementFigure.java*/package cn.edu.nudt.executabledm2.diagram.custom;import org.eclipse.draw2d.Graphics;import org.eclipse.draw2d.Label;import org.eclipse.draw2d.Panel;import org.eclipse.draw2d.geometry.Rectangle;import org.eclipse.swt.SWT;import org.eclipse.swt.graphics.Color;import org.eclipse.swt.graphics.Image;public abstract class AbstractElementFigure extends Panel{    private Label label = new Label();      protected static ImageUtil imgUtil=new ImageUtil();      public AbstractElementFigure() {          add(label);          customizeFigure();          setSize(64, 64);      }      protected abstract void customizeFigure();      public void setIcon(Image icon) {          label.setIcon(icon);      }      public void setText(String text) {          label.setText(text);      }      public Label getLabel() {          return label;      }      public void setColor(Color color) {          setBackgroundColor(color);      }      public void setBounds(Rectangle bounds) {          bounds.setSize(64, 64);          super.setBounds(bounds);          label.setBounds(bounds);      }      public void paint(Graphics g) {          int saved = g.getAntialias();          g.setAntialias(SWT.ON);          super.paint(g);          g.setAntialias(saved);      }  }
/*ImageUtil.java*/package cn.edu.nudt.executabledm2.diagram.custom;import org.eclipse.swt.graphics.Image;import org.eclipse.ui.plugin.AbstractUIPlugin;public class ImageUtil {    public Image getImgFromPlugIn(String plugIn,String path){          Image result=AbstractUIPlugin.imageDescriptorFromPlugin(plugIn, path).createImage();          return result;      } }

之后,在该项目目录内创建一个与src同级别的目录icons,将所有加载的图片放在该目录下。并为每一个自定义的图像写一个java类,一个为CapabilityViewpoint定义的一个java类:

/*CapabilityViewpointFigure.java*/package cn.edu.nudt.executabledm2.diagram.custom;import org.eclipse.swt.graphics.Image;public class CapabilityViewpointFigure extends AbstractElementFigure{/*cn.edu.nudt.executabledm2.diagram.custom为包名,图片放在icons目录下*/    private static final Image icon= imgUtil.getImgFromPlugIn("cn.edu.nudt.executabledm2.diagram.custom",                   "icons/CapabilityViewpoint.png");      @Override      protected void customizeFigure() {          setIcon(icon);      }  } 

对于不同的项目,不同的图像,需要修改的只有三处,一是针对不同图像的类名和图像的文件名,一个就是根据不同项目需要设置的包名。其中图像的文件名和包名都用在getImgFromPlugIn函数中。

然后,在GMF项目的gmfgraph模型的Canvas节点下的Figure Gallery Defualt节点下创建Figure Descriptor元素,并为其创建一个Custom Figure子元素,设置其Qualified Class Name属性,例如cn.edu.nudt.executabledm2.diagram.custom.CapabilityViewpointFigure

创建CustomFigure

然后就可以将创建的Figure Descriptor分派给gmfgraph中的相应的Node节点,供建模环境使用了。
节点分配图

由于修改了gmfgraph,需要重新生成gmfgen模型(不需要重新生成gmfmap,并根据需要对gmfgen文件进行相应调整,如为支持双击打开子视图修改部分类名等),并重新生成代码。

之后,修改生成的依赖该自定义图元的diagram所在项目的MANIFEST.MF文件,在文件的最后添加一行代码:

Import-Package: cn.edu.nudt.executabledm2.diagram.custom

将新建的Plugin-in项目的包导入到该项目中。或者在出现依赖图元定义错误后,选择由Eclipse自动修正问题。

运行项目,创建图形化建模环境,现在创建相应元素就会显示相应的图片。
运行截图

注意:如果在GMF中构建的Custom Figure下没有添加Label子元素,则必须为其添加一个布局,例如FlowLayout,否则生成的代码会有问题,图片在图形化编辑器中就无法显示。

参考文献

http://blog.csdn.net/javaman_chen/article/details/6447458

0 0
原创粉丝点击