最近我在用GEF的一个图形编辑框架,很惭愧,自己Java还半生不熟,就直接被拉来做项目。
闲话短说,在项目进行过程中,涉及到这样的功能:将自己的Editor中的内容保存成图片。
我在网上找了一些资料,但是说得不够具体,可能对于像我这种Java菜鸟,又刚开始接触GEF的不大容易理解,通过自己的摸索,终于把图片导出来了,以下是我的实现过程:
1.首先要写一个创建图片文件的方法createImage(),这个我也是从网上摘抄来的,感谢网友的无私支持:
/**
* Returns the bytes of an encoded image for the specified
* IFigure in the specified format.
*
* @param figure the Figure to create an image for.
* @param format one of SWT.IMAGE_BMP, SWT.IMAGE_BMP_RLE,SWT.IMAGE_GIF
* SWT.IMAGE_ICO, SWT.IMAGE_JPEG, or SWT.IMAGE_PNG
* @return the bytes of an encoded image for the specified Figure
*/
private byte[] createImage(IFigure figure, int format) {
Device device = getEditPartViewer().getControl().getDisplay();
Rectangle r = figure.getBounds();
ByteArrayOutputStream result = new ByteArrayOutputStream();
Image image = null;
GC gc = null;
Graphics g = null;
try {
image = new Image(device, r.width, r.height);
gc = new GC(image);
g = new SWTGraphics(gc);
g.translate(r.x * -1, r.y * -1);
figure.paint(g);
ImageLoader imageLoader = new ImageLoader();
imageLoader.data = new ImageData[] {image.getImageData()};
imageLoader.save(result, format);
} finally {
if (g != null) {
g.dispose();
}
if (gc != null) {
gc.dispose();
}
if (image != null) {
image.dispose();
}
}
return result.toByteArray();
}
摘自
http://tjlvan.iteye.com/blog/226627
2.然后是第二步,也是之前我在网上找资料时比较迷惑不解的地方,即这个方法在什么地方使用? 我是这样实现的:
在我们自己创建的Editor的那个类中来用它。不管是RCP还是在Eclipse IDE中GEF应该都有一个自己的Editor(比如我的是MyFrameDeployEditor),即程序运行时那个空白编辑区(也叫“画板”),我在这个类的doSave()中使用以上方法,在保存文件为xml或者序列化的同时将画板上的内容另保存成图片文件。具体代码如下:
public class MyFrameDeployEditor extends GraphicalEditorWithPalette {
...
public void doSave(IProgressMonitor monitor) {
//...这里将GEF项目保存成XML文件或者序列化为二进制文件或者可以什么都不做
//以下为保存图片的代码,弹出一个对话框,定义好路径和名字后,调用以上创建图片文件的方法,即可保存成图片。
FileDialog dialog = new FileDialog(getSite().getWorkbenchWindow().getShell(), SWT.SAVE);
dialog.setText("保存图片文件");
dialog.setFilterNames(new String[] { "PNG(*.png)" });
dialog.setFilterExtensions(new String[] { "*.png", "*.*" });
String fileName = dialog.open();
ScalableRootEditPart rootPart = (ScalableRootEditPart)this.getGraphicalViewer().getRootEditPart();//这里你根据你自己的Editor设置的是什么RootEditPart类型就定义什么类型即可,我这里是ScalableRootEditPart
IFigure figure = rootPart.getLayer(ScalableRootEditPart.PRINTABLE_LAYERS);
byte[] data = createImage(figure, SWT.IMAGE_PNG); //调用createImage()方法
try {
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(data);
fos.close();
MessageDialog.openInformation(this.getSite().getShell(), "导出",
"图形已经导出到 " + fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
...
}
分享到:
相关推荐
在本教程中,我们将深入探讨GEF的基本概念、设计原则以及如何使用它来开发自己的图形编辑器。 **1. GEF简介** GEF的设计目标是将图形编辑器的实现细节抽象化,让开发者能够专注于业务逻辑和模型设计,而不是底层的...
在GEF中,模型通常由EMF(Eclipse Modeling Framework)来定义和管理,可以将业务逻辑和视图分离。 2. **视图(View)**:视图是模型的可视化表示,它将模型数据呈现为用户界面。GEF提供了基础框架来实现这一转换,...
标题中的“GEF资源打包”指的是一个集合了关于GEF(Graph Edit Framework)的各种学习资料的压缩文件。这个资源包可能包含了对理解、学习和使用GEF非常有帮助的材料。描述进一步说明了这个包中包含的具体内容,如...
在GEF中,模型通常由`EObject`和`EObjectImpl`实现,可以使用EMF(Eclipse Modeling Framework)来生成。 2. **视图(View)**: 视图是模型的可视化表示,将模型数据呈现给用户。GEF中的视图由`GraphicalViewer`类...
在gef中,转折线的实现涉及到PathFigure和Segment类的使用。PathFigure用于定义一个图形的轮廓,而Segment则代表了轮廓中的一段线段。通过添加和调整Segment实例,我们可以构建出具有转折点的线条。 实现gef转折线...
**GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的...对于希望在Java和Eclipse环境中提升图形界面开发技能的程序员来说,"GEF入门必读 GEF入门系列 GEF-whole-upload"是一个不可多得的学习资源。
5. 数据持久化:介绍如何利用EMF的持久化服务将模型数据保存和加载到文件中。 6. 插件开发:讲解如何在Eclipse插件系统中集成GEF和EMF,以及如何发布和部署你的图形化应用。 7. 实战案例:通过实际项目案例,演示GEF...
此外,理解MVC(模型-视图-控制器)模式和MVC在GEF中的应用对于提升开发效率至关重要。 总之,通过这个"GEF入门实例代码2",开发者可以了解到如何在Eclipse中构建一个基于GEF的图形编辑器,这不仅涉及数据模型的...
在RCP项目中,**Editor**是最常见的GEF承载对象,它继承自`EditorPart`,提供了图形修改后的自动保存机制,这是View不具备的功能。 为了构建GEF编辑器,需要创建以下三个核心组件: 1. **模型(Model)**:定义数据...
- **Draw2D**: 版本3.1.0或以上,通常包含在GEF中 - **EMF**: 版本2.1.0或以上 ### 创建RCP项目 1. **初始化项目**: - 打开Eclipse并选择“File” > “New” > “Other” > “Plug-in Project”。 - 为项目命名`...
在GEF中,模型是数据结构的抽象,用于存储和管理图形化编辑器所显示的信息。开发者需要定义自己的模型类,这些类通常继承自GEF提供的基础类,如`org.eclipse.gef.mvc.models.Model`。模型类中的属性和方法反映了图形...
本文将深入探讨如何在GEF中实现属性视图,并通过一个处理器(Processor)模型的例子来阐述具体步骤。 1. **属性视图的概述** - 属性视图用于展示图形模型的相关属性,如处理器的温度、IP地址和类型等。 - 当图形...
这两篇文章可能分别由CSDN博主和博客园博主分享了他们在使用GEF和相关技术,如Draw2D(用于在GEF中绘制2D图形的库)时的经验和技巧。 在深入理解GEF时,我们需要关注以下几个核心概念: 1. **模型-视图-控制器(MVC...
在GEF中,模型需具备变化通知机制,以便于及时更新控制器和视图。通常,模型的设计应紧密贴合业务逻辑,以确保数据的准确性和完整性。 2. **控制器(Control)**:控制器,即EditPart,是GEF的核心部件,负责处理模型...
这是我自己在学习GEF的时候做的一些总结。 1、GEF中的概念比如Command,Tool,Request等等。 2、GEF中使用到的几种设计模式。 3、GEF中对鼠标键盘事件处理的机制、流程。
GEF中的Figure类负责图形绘制,通过重写paint()方法实现自定义图形的绘制,同时支持事件监听和交互。 5. **编辑操作与命令模式** GEF使用命令模式来处理用户的编辑操作,每个编辑操作对应一个Command对象。当用户...
《GEF-SDK-3.6.2 jar:Eclipse GEF框架详解及在Android ADT中的应用》 GEF(Graphical Editing Framework)是Eclipse项目中的一个重要组成部分,它为开发图形化编辑器提供了强大的支持。在标题“GEF-SDK-3.6.2 jar...
描述中的"GEF Example Source Code"进一步强调了这是一个专注于GEF实际应用的代码资源,可能是为了教学目的或帮助开发者快速上手。通过查看和分析这些示例代码,开发者可以学习到如何处理图形绘制、交互操作、模型...
- **Draw2D**:包含在GEF中,版本3.1.0及以上 - **EMF (Eclipse Modeling Framework)**:2.1.0 及以上版本 #### 二、创建RCP项目 - **RCP (Rich Client Platform)**:基于Eclipse的富客户端平台,提供了一种构建...