`
LuChar
  • 浏览: 74930 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

GEF原理及实现系列(七、模型同步)

    博客分类:
  • GEF
阅读更多
为了保证数据和展现的同步,必须要有一种消息通知机制,当模型被修改时通知相应的视图进行更新,下面将介绍如何实现这种消息机制。
1.模型同步的功能
    模型是GEF中实体,当模型的属性被修改后,控制器会监听到模型属性改变的事件,然后通知视图进行更新,模型和视图之间没有直接的联系,如下图:

    要通过事件的通知机制获得模型同步的步骤如下:
    (1)模型中包含注册监听器的机制,本文范例是通过PropertyChangeSupport和PropertyChangeListener机制添加模型监听器。
    (2)把控制器注册为模型监听器,在此通过控制器实现PropertyChangeListener接口,并把自己添加到模型的监听器即可。
    (3)当模型触发属性改变的事件后,控制器监听到事件并相应的更新视图。
        另外,并不是模型的所有属性的改变都必须通知控制器,一般情况下,当模型的属性更改后要引起视图的更新时,必须触发事件通知控制器,因为模型和视图之间没有    任何的关联。
2.模型同步的实现
    典型的模型对象会包含PropertyChangeSupport类型的成员变量,用来触发事件,通知监听器即控制器。当模型的属性被修改后,控制器将更 新视图的显示。例如,某个节点的名字修改后,将要触发相应的事件,通知控制器,如在前面提到的Node类中有如下片段:
java 代码
 
  1. public void setName(String name) {  
  2.         if (this.name.equals(name)) {  
  3.             return;  
  4.         }  
  5.         this.name = name;  
  6.         //当模型的名字改变后,通知监听器更新名字的显示  
  7.         firePropertyChange(PROP_NAME, null, name);  
  8.     }  

    当模型的名字改变后,将通过firePropertyChange方法触发模型名字被修改的事件,其中第一个参数为事件类型唯一标识,表示模型的什么属性被改变,第二个参数为改变钱的值,第三个参数为改变后的新值。
    模型触发事件后,控制器将监听到模型属性修改的事件,通知事件的类型,即firePropertyChange方法的第一个参数判断是哪一个属性被修改,然后执行相应的操作。下面是NodePart中相应的操作代码:
//监听模型属性改变
   
java 代码
 
  1. public void propertyChange(PropertyChangeEvent evt) {  
  2.         if (evt.getPropertyName().equals(Node.PROP_LOCATION))  
  3.             //更新视图  
  4.             refreshVisuals();  
  5.         else if (evt.getPropertyName().equals(Node.PROP_NAME))  
  6.             refreshVisuals();  
  7.         else if (evt.getPropertyName().equals(Node.PROP_INPUTS))  
  8.             //更新连接  
  9.             refreshTargetConnections();  
  10.         else if (evt.getPropertyName().equals(Node.PROP_OUTPUTS))  
  11.             refreshSourceConnections();  
  12.     }  

    当控制器监听到模型的改变事件后,将会通过视图的更新,从而实现了模型数据和视图显示的同步。
分享到:
评论

相关推荐

    GEF连接线Node之间连接

    总的来说,理解和实现“GEF连接线Node之间连接”需要掌握`GEF`框架的基本结构、事件处理、模型与视图的分离、以及图形元素的布局和约束。这不仅可以帮助你构建出强大的图形编辑工具,也能提升你在图形界面开发领域的...

    GEF Description

    为了实现视图与数据模型之间的动态更新,GEF 引入了观察者模式。当数据模型发生变化时,所有依赖于该模型的视图都会自动更新,反之亦然。这样就确保了数据的一致性和准确性。 #### 四、GEF 的核心组件 GEF 包含多...

    GEF初学者开发样例

    - **模型与视图同步**: 显示如何保持模型和视图的一致性。 - **自定义图形**: 教程可能会介绍如何创建自定义图形元素和它们的行为。 - **扩展与插件**: 可能会涉及到如何将GEF编辑器集成到Eclipse IDE中,作为...

    gef入门学习项目源码

    通过这个项目,你将学习到如何创建一个新的GEF编辑器,包括定义模型,创建图元和编辑领域,实现绘图功能,以及添加用户交互。同时,它也是一个很好的实践平台,可以尝试修改源码,观察不同改动对图形界面的影响,...

    GEF及GMF入门学习

    ### GEF及GMF入门学习知识点详解 #### 一、GEF与GMF概述 - **GEF**(Graphical Editing Framework)是Eclipse提供的一个用于构建图形编辑器的框架,它提供了一套完整的API来支持图形化界面的创建、编辑和管理。GEF...

    GEF的Eclipse官方示例(源代码)

    GEF主要用于设计和实现基于模型的图形编辑器,这些编辑器可以用于绘制流程图、网络拓扑图、UML模型等。在深入探讨GEF的Eclipse官方示例之前,我们先来了解一下GEF的基本概念和组件。 1. **模型(Model)**:模型是...

    gef学习文档+学习源码

    Gef可以协助开发者检测内存泄漏、分析线程同步问题,以及深入理解数据在不同组件间的传递。 在“gef学习文档和编写源码”这个压缩包中,你将找到详细的教程,涵盖了上述各个方面的内容。通过文档,你可以逐步学习...

    GEF-whole-upload.pdf附书源码

    这份资料可能是为了帮助读者深入理解GEF的工作原理和实践应用。 【描述】"GEF-whole-upload.pdf附书源码" 提示我们这份资源不仅提供了理论知识,还包含了实践部分。通过阅读PDF书籍,读者可以学习到GEF的基础概念、...

    GEF入门教材(相当不错的资源)

    - **数据绑定**:如何将用户界面与后台数据模型进行绑定,实现数据同步更新。 #### 六、结论 通过深入学习和实践GEF,开发者不仅能够掌握一个强大的图形编辑框架,还能深入了解并应用诸如命令模式、MVC模式等经典...

    用gef写的一个tree例子(无移动)

    3. **模型和视图的同步**:理解如何将数据模型映射到图形视图,例如树节点的数据如何驱动图元的显示。 4. **事件处理**:尽管例子中提到的是“无移动”,但你可能仍然会遇到关于鼠标点击、拖放等事件的处理,这是...

    Eclipse Development using the Graphical Editing Framework and the Eclipse Modeling Framework

    GEF和EMF的结合使用,可以实现模型驱动的图形化编辑。EMF用于定义模型,而GEF则负责将这些模型可视化,并提供交互式编辑功能。这种组合不仅提高了开发效率,还增强了应用程序的可维护性和可扩展性。 总之,《使用...

    Eclipse Modeling Project(A Domain-Specific Language Toolkit)

    GMF实现原理主要包括图形化编辑器的生成过程、图形对象的交互机制以及模型与图形之间的同步机制。 ##### 4. GMF编辑器实现 GMF支持多种类型的编辑器实现,包括基本编辑器、高级编辑器以及自定义编辑器。基本编辑器...

Global site tag (gtag.js) - Google Analytics