`
longgangbai
  • 浏览: 7330945 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

gef中编辑图中添加背景图片原理以及实现

阅读更多

  GEFRootEditPart对应的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、用于创建 EditPartEditPartFactory

    * ContentsDiagram对象和增加了拖放支持,拖动目标是当前 EditPartViewer,后面会看到拖动源就是调色板。

    */

   /**

    * 用来定制GraphicalViewer的各种信息

    * 在这两个方法里我们配置了RootEditPart、用于创建 EditPartEditPartFactory

    * ContentsDiagram对象和增加了拖放支持,拖动目标是当前 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中属性页面的实现

    在GEF(Graphical Editing Framework)中,属性视图(Property View)的实现是一个关键功能,它允许用户查看和编辑图形模型的属性。属性视图是数据源与用户界面之间的桥梁,确保图形模型和属性视图之间保持同步更新...

    GEF实现拷贝粘贴

    标题“GEF实现拷贝粘贴”涉及到的是在软件开发中使用Graphical Editing Framework(GEF)进行图形界面编辑时,如何实现复制和粘贴功能的技术。GEF是Eclipse平台下用于构建图形化编辑器的框架,它提供了一套完整的...

    gef 转折线的相关方法实现和 GEF的API chm 格式

    在本篇文章中,我们将深入探讨gef转折线的相关方法实现以及GEF的API。 首先,让我们理解一下什么是转折线。在图形编辑中,转折线通常指的是具有多个折点的线条,这些折点可以由用户交互式地调整,以改变线条的形状...

    GEF中文教程+代码

    在本教程中,我们将深入探讨GEF的基本概念、设计原则以及如何使用它来开发自己的图形编辑器。 **1. GEF简介** GEF的设计目标是将图形编辑器的实现细节抽象化,让开发者能够专注于业务逻辑和模型设计,而不是底层的...

    GEF典型实现例子

    源码标签表明内容可能包含了实际的代码示例,这对于学习和理解GEF的工作原理和如何在实际项目中应用非常有帮助。工具标签则暗示了这个例子可能涉及到了使用GEF作为开发工具或者集成到其他工具链中的情况。 文件名...

    [翻译]Eclipse图形化编辑框架(GEF)/更新第7章:层和视图

    视图通常与Eclipse工作台中的其他组件一起使用,如编辑器、透视图等,提供了一种灵活的方式来组织和展示信息。 **第7章:层和视图的更新内容** 在更新的第7章中,博主可能详细介绍了以下几点: 1. **层的创建与...

    GEF 入门版中文教程 源码

    6. **连接器(Connectors)**和**连接线(Edges)**:对于有向图或网络图的编辑,GEF支持创建和管理连接线,以表示元素之间的关系。 7. **手势(Gestures)**和**事件(Events)**:GEF识别用户的手势,如拖拽、点击等,并...

    GEF入门学习例子

    这个入门学习例子旨在帮助初学者理解GEF的基本用法和核心概念,通过实例展示如何利用GEF实现工具栏、菜单栏、属性栏以及图形的交互功能,如移动、删除、撤销、连线等,并涵盖了大纲视图和鹰眼功能的实现。...

    RCP与GEF课件,介绍RCP和GEF各组成部分和工作原理

    **GEF(Graphical Editing Framework)** 是Eclipse中的一个图形编辑框架,它为开发图形化编辑器提供了基础。GEF支持创建各种图形用户界面,包括绘图工具、流程图和模型编辑器。 GEF的主要组件包括: 1. **Model**...

    GEF原理的详细介绍+程序实例和程序源码

    **GEF(Graphical Editing Framework)** 是一个用于构建图形化编辑器的开源框架,它在Eclipse平台中被广泛使用。GEF提供了一套全面的API和模型,帮助开发者快速构建可定制的、交互式的图形用户界面。该框架的核心...

    GEF快速入门教程和EMF教程

    通过本教程,您应该能够理解GEF的基本结构和工作原理,以及如何在Eclipse RCP应用中集成GEF。此外,还介绍了如何设置项目依赖、创建编辑器以及实现GEF的基本组件。这些步骤不仅适用于本教程的示例,也是构建更复杂...

    一个GEF绘图的简单例子

    **GEF绘图框架简介** ...通过学习这个例子,开发者可以深入理解GEF的工作原理,进一步利用GEF开发复杂的图形编辑应用。同时,这也是一个很好的实践机会,可以加深对Eclipse RCP和图形编程的理解。

    GEF开发指南

    GEF的开发指南详细讲解了如何使用该框架进行图形编辑,内容涵盖了从创建RCP(Rich Client Platform)插件开始,到创建图形编辑器、与图形的交互、撤销/回复操作、缩放、快捷键设置、大纲视图、鸟瞰视图、环境菜单、...

    GEF入门必读 GEF入门系列 GEF-whole-upload

    1. **基本概念**:介绍GEF的关键概念,如Figure、EditPart、Command、Model等,以及它们在图形编辑中的角色。 2. **图形组件**:讲解如何创建和操作图形元素,如矩形、圆形、文本等,以及如何添加连接线和组合图形。...

    GEF入门实例代码2《Eclipse插件开发》中实例

    总之,通过这个"GEF入门实例代码2",开发者可以了解到如何在Eclipse中构建一个基于GEF的图形编辑器,这不仅涉及数据模型的设计,还包括视图的绘制、用户交互的处理以及可撤销/重做机制的实现。通过实践,开发者可以...

    Eclipse开发使用GEF和EMF(IBM 红皮书)中英文对照版

    在Eclipse中,GEF(图形编辑框架)提供了一套用于构建图形编辑器的框架,使得开发者可以轻松地创建出复杂的图形用户界面,如流程图、网络拓扑图等。GEF提供了丰富的图形操作和交互机制,包括拖放、选择、连接线绘制...

    GEF教程及demo源码GEF_RCP_DEMO.zip

    EditPolicy是GEF中用于实现特定编辑行为的适配器。它允许EditPart根据当前上下文动态改变其行为,增加了系统的灵活性。 7. **RCP(Rich Client Platform)** Eclipse RCP是一个用于构建桌面应用程序的框架,它...

    GEF中文帮助实例

    GEF(Graphical Editing Framework)是Eclipse平台中的一个组件,主要用于创建图形化的编辑器。它提供了一套完整的框架,用于构建可扩展的、交互式的图形编辑应用程序,特别是针对那些需要可视表示的数据模型。GEF为...

    GEF锚点鼠标定位

    在图形编辑框架(GEF,Graphical Editing Framework)中,锚点(Anchor)是一个关键概念,它是连接模型元素之间的连接线在元素上的固定点。在GEF中,锚点的定位直接影响到连接线的形状和行为,特别是当用户通过鼠标...

Global site tag (gtag.js) - Google Analytics