GEF的RootEditPart对应的Figure是一个由多个Layer组成的LayeredPane,每个Layer负责包含不同类型的图形元素,如节点、连接、网格线等等。所以要让图形编辑器显示一个图片作为背景,可以在它们其中一个层里绘制这个图片,也可以添加一个层专门放置背景图片。在gef中所有的图形元件继承自Figure类。实现背景色和背景图的更改的必须实现Figure中部分类。
由源代码:
/**用于绘制元件和元件内的子元件系列
* Paints this Figure and its children.
* @param graphics The Graphics object used for painting
* @see #paintFigure(Graphics)
* @see #paintClientArea(Graphics)
* @see #paintBorder(Graphics)
*/
publicvoid paint(Graphics graphics) {
if (getLocalBackgroundColor() != null)
graphics.setBackgroundColor(getLocalBackgroundColor());
if (getLocalForegroundColor() != null)
graphics.setForegroundColor(getLocalForegroundColor());
if (font != null)
graphics.setFont(font);
graphics.pushState();
try {
paintFigure(graphics);
graphics.restoreState();
paintClientArea(graphics);
paintBorder(graphics);
} finally {
graphics.popState();
}
}
/**用于绘制边框border对象
* Paints the border associated with this Figure, if one exists.
* @param graphics The Graphics used to paint
* @see Border#paint(IFigure, Graphics, Insets)
* @since 2.0
*/
protectedvoid paintBorder(Graphics graphics) {
if (getBorder() != null)
getBorder().paint(this, graphics, NO_INSETS);
}
/**用于绘制所有子元件对象
* Paints this Figure's children. The caller must save the state of the graphics prior to
* calling this method, such that <code>graphics.restoreState()</code> may be called
* safely, and doing so will return the graphics to its original state when the method was
* entered.
* <P>
* This method must leave the Graphics in its original state upon return.
* @param graphics the graphics used to paint
* @since 2.0
*/
protectedvoid paintChildren(Graphics graphics) {
IFigure child;
Rectangle clip = Rectangle.SINGLETON;
for (int i = 0; i < children.size(); i++) {
child = (IFigure)children.get(i);
if (child.isVisible() && child.intersects(graphics.getClip(clip))) {
graphics.clipRect(child.getBounds());
child.paint(graphics);
graphics.restoreState();
}
}
}
/**绘制子元件区域对象
* Paints this Figure's client area. The client area is typically defined as the anything
* inside the Figure's {@link Border} or {@link Insets}, and by default includes the
* children of this Figure. On return, this method must leave the given Graphics in its
* initial state.
* @param graphics The Graphics used to paint
* @since 2.0
*/
protectedvoid paintClientArea(Graphics graphics) {
if (children.isEmpty())
return;
boolean optimizeClip = getBorder() == null || getBorder().isOpaque();
if (useLocalCoordinates()) {
graphics.translate(
getBounds().x + getInsets().left,
getBounds().y + getInsets().top);
if (!optimizeClip)
graphics.clipRect(getClientArea(PRIVATE_RECT));
graphics.pushState();
paintChildren(graphics);
graphics.popState();
graphics.restoreState();
} else {
if (optimizeClip)
paintChildren(graphics);
else {
graphics.clipRect(getClientArea(PRIVATE_RECT));
graphics.pushState();
paintChildren(graphics);
graphics.popState();
graphics.restoreState();
}
}
}
/** 绘制元件的背景等信息
* Paints this Figure's primary representation, or background. Changes made to the
* graphics to the graphics current state will not affect the subsequent calls to {@link
* #paintClientArea(Graphics)} and {@link #paintBorder(Graphics)}. Furthermore, it is safe
* to call <code>graphics.restoreState()</code> within this method, and doing so will
* restore the graphics to its original state upon entry.
* @param graphics The Graphics used to paint
* @since 2.0
*/
protectedvoid paintFigure(Graphics graphics) {
if (isOpaque())
graphics.fillRectangle(getBounds());
if (getBorder() instanceof AbstractBackground)
((AbstractBackground) getBorder()).paintBackground(this, graphics, NO_INSETS);
}
由上面的源代码可以看出:
/**
* 用来定制GraphicalViewer的各种信息
* 在这两个方法里我们配置了RootEditPart、用于创建 EditPart的EditPartFactory、
* Contents即Diagram对象和增加了拖放支持,拖动目标是当前 EditPartViewer,后面会看到拖动源就是调色板。
*/
/**
* 用来定制GraphicalViewer的各种信息
* 在这两个方法里我们配置了RootEditPart、用于创建 EditPart的EditPartFactory、
* Contents即Diagram对象和增加了拖放支持,拖动目标是当前 EditPartViewer,后面会看到拖动源就是调色板。
*/
@Override
protectedvoid configureGraphicalViewer() {
super.configureGraphicalViewer();
//添加背景图片
this.getGraphicalViewer().setRootEditPart(new ScalableFreeformRootEditPart(){
//可以注入自己设定的层
@Override
protected LayeredPane createPrintableLayers(){
LayeredPane layeredPane= super.createPrintableLayers();
layeredPane.add(new FreeformLayer(),PRIMARY_LAYER);
//可以添加自定一的层layer接口定义
layeredPane.add(new FreeformLayer(),CONNECTION_LAYER);
return layeredPane;
}
//添加背景色和背景图
@Override
protectedvoid createLayers(LayeredPane layeredPane) {
Layer layer=new FreeformLayer(){
protected
相关推荐
在GEF(Graphical Editing Framework)中,属性视图(Property View)的实现是一个关键功能,它允许用户查看和编辑图形模型的属性。属性视图是数据源与用户界面之间的桥梁,确保图形模型和属性视图之间保持同步更新...
标题“GEF实现拷贝粘贴”涉及到的是在软件开发中使用Graphical Editing Framework(GEF)进行图形界面编辑时,如何实现复制和粘贴功能的技术。GEF是Eclipse平台下用于构建图形化编辑器的框架,它提供了一套完整的...
在本篇文章中,我们将深入探讨gef转折线的相关方法实现以及GEF的API。 首先,让我们理解一下什么是转折线。在图形编辑中,转折线通常指的是具有多个折点的线条,这些折点可以由用户交互式地调整,以改变线条的形状...
在本教程中,我们将深入探讨GEF的基本概念、设计原则以及如何使用它来开发自己的图形编辑器。 **1. GEF简介** GEF的设计目标是将图形编辑器的实现细节抽象化,让开发者能够专注于业务逻辑和模型设计,而不是底层的...
源码标签表明内容可能包含了实际的代码示例,这对于学习和理解GEF的工作原理和如何在实际项目中应用非常有帮助。工具标签则暗示了这个例子可能涉及到了使用GEF作为开发工具或者集成到其他工具链中的情况。 文件名...
视图通常与Eclipse工作台中的其他组件一起使用,如编辑器、透视图等,提供了一种灵活的方式来组织和展示信息。 **第7章:层和视图的更新内容** 在更新的第7章中,博主可能详细介绍了以下几点: 1. **层的创建与...
6. **连接器(Connectors)**和**连接线(Edges)**:对于有向图或网络图的编辑,GEF支持创建和管理连接线,以表示元素之间的关系。 7. **手势(Gestures)**和**事件(Events)**:GEF识别用户的手势,如拖拽、点击等,并...
这个入门学习例子旨在帮助初学者理解GEF的基本用法和核心概念,通过实例展示如何利用GEF实现工具栏、菜单栏、属性栏以及图形的交互功能,如移动、删除、撤销、连线等,并涵盖了大纲视图和鹰眼功能的实现。...
**GEF(Graphical Editing Framework)** 是Eclipse中的一个图形编辑框架,它为开发图形化编辑器提供了基础。GEF支持创建各种图形用户界面,包括绘图工具、流程图和模型编辑器。 GEF的主要组件包括: 1. **Model**...
**GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台中被广泛使用。GEF提供了一套全面的API和模型,帮助开发者快速构建可定制的、交互式的图形用户界面。该框架的核心...
通过本教程,您应该能够理解GEF的基本结构和工作原理,以及如何在Eclipse RCP应用中集成GEF。此外,还介绍了如何设置项目依赖、创建编辑器以及实现GEF的基本组件。这些步骤不仅适用于本教程的示例,也是构建更复杂...
**GEF绘图框架简介** ...通过学习这个例子,开发者可以深入理解GEF的工作原理,进一步利用GEF开发复杂的图形编辑应用。同时,这也是一个很好的实践机会,可以加深对Eclipse RCP和图形编程的理解。
GEF的开发指南详细讲解了如何使用该框架进行图形编辑,内容涵盖了从创建RCP(Rich Client Platform)插件开始,到创建图形编辑器、与图形的交互、撤销/回复操作、缩放、快捷键设置、大纲视图、鸟瞰视图、环境菜单、...
1. **基本概念**:介绍GEF的关键概念,如Figure、EditPart、Command、Model等,以及它们在图形编辑中的角色。 2. **图形组件**:讲解如何创建和操作图形元素,如矩形、圆形、文本等,以及如何添加连接线和组合图形。...
总之,通过这个"GEF入门实例代码2",开发者可以了解到如何在Eclipse中构建一个基于GEF的图形编辑器,这不仅涉及数据模型的设计,还包括视图的绘制、用户交互的处理以及可撤销/重做机制的实现。通过实践,开发者可以...
在Eclipse中,GEF(图形编辑框架)提供了一套用于构建图形编辑器的框架,使得开发者可以轻松地创建出复杂的图形用户界面,如流程图、网络拓扑图等。GEF提供了丰富的图形操作和交互机制,包括拖放、选择、连接线绘制...
EditPolicy是GEF中用于实现特定编辑行为的适配器。它允许EditPart根据当前上下文动态改变其行为,增加了系统的灵活性。 7. **RCP(Rich Client Platform)** Eclipse RCP是一个用于构建桌面应用程序的框架,它...
GEF(Graphical Editing Framework)是Eclipse平台中的一个组件,主要用于创建图形化的编辑器。它提供了一套完整的框架,用于构建可扩展的、交互式的图形编辑应用程序,特别是针对那些需要可视表示的数据模型。GEF为...
在图形编辑框架(GEF,Graphical Editing Framework)中,锚点(Anchor)是一个关键概念,它是连接模型元素之间的连接线在元素上的固定点。在GEF中,锚点的定位直接影响到连接线的形状和行为,特别是当用户通过鼠标...