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

GEF原理及实现系列(二、模型)

    博客分类:
  • GEF
阅读更多
GEF的模型只与控制器打交道,而不知道任何与视图有关的东西。
1.模型的功能
    在GEF框架中,模型(Model)是非常简单的一部分,用户可把模型理解成一个简单的可持久化的实体。但为了能让控制器知道模型的变化,应该把控制器作为事件监听者注册在模型中,当模型发生变化时,就触发相应的事件给控制器,后者负责通知各个视图进行更新。
2.模型的实现
    典型的模型对象会包含PropertyChangeSupport类型的成员变量,用来触发事件,通知监听器即控制器。一般来说,模型会实现一个基类,用来封装事件机制,主要包括添加监听器、删除监听器,以及模型属性改变触发的相应事件,代码如下:
java 代码
 
  1. package com.example.model;  
  2.   
  3. import java.beans.PropertyChangeListener;  
  4. import java.beans.PropertyChangeSupport;  
  5. import java.io.Serializable;  
  6.   
  7. public abstract class Element implements Cloneable, Serializable {  
  8.   
  9.     PropertyChangeSupport listeners = new PropertyChangeSupport(this);  
  10.     //添加监听器  
  11.     public void addPropertyChangeListener(PropertyChangeListener l) {  
  12.         listeners.addPropertyChangeListener(l);  
  13.     }  
  14.     //触发属性改变的事件  
  15.     protected void firePropertyChange(String prop, Object old, Object newValue) {  
  16.         listeners.firePropertyChange(prop, old, newValue);  
  17.     }  
  18.     //触发结构改变的事件  
  19.     protected void fireStructureChange(String prop, Object child) {  
  20.         listeners.firePropertyChange(prop, null, child);  
  21.     }  
  22.   
  23. //    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {  
  24. //        in.defaultReadObject();  
  25. //        listeners = new PropertyChangeSupport(this);  
  26. //    }  
  27.     //删除监听器  
  28.     public void removePropertyChangeListener(PropertyChangeListener l) {  
  29.         listeners.removePropertyChangeListener(l);  
  30.     }  
  31.   
  32. }  

    另外,当用户希望通过属性视图编辑模型属性时,模型要实现IPropertySource接口,该接口的方法解释如下:
   
package org.eclipse.ui.views.properties;

public interface IPropertySource {

    public Object getEditableValue();//得到在属性页中能编辑的值,可以返回this表示当前模型

    public IPropertyDescriptor[] getPropertyDescriptors();//得到IPropertyDescriptor类型的数组,其中每一项为属性页中能编辑的项
   
    public Object getPropertyValue(Object id);//通过id值得到某个属性,在添加每一项IPropertyDescriptor时都会指定id值

    public boolean isPropertySet(Object id);//表示特定属性id值是否改变

    public void resetPropertyValue(Object id);//通过id重置属性

    public void setPropertyValue(Object id, Object value);//通过id和值设置某一项属性的值
}
    如果模型和其它模型有关系(在视图上为连线),模型要维护这些关系,并适当的持久化,当模型的属性修改后,模型要触发相应的事件通知监听器。
java 代码
 
  1. package com.example.model;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.eclipse.draw2d.geometry.Point;  
  7. import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;  
  8. import org.eclipse.ui.views.properties.IPropertyDescriptor;  
  9. import org.eclipse.ui.views.properties.IPropertySource;  
  10. import org.eclipse.ui.views.properties.TextPropertyDescriptor;  
  11.   
  12. public class Node extends Element implements IPropertySource {  
  13.     //定义属性的常量ID   
  14.     final public static String PROP_LOCATION = "LOCATION";  
  15.   
  16.     final public static String PROP_NAME = "NAME";  
  17.   
  18.     final public static String PROP_VISIBLE = "VISIBLE";  
  19.   
  20.     final public static String PROP_INPUTS = "INPUTS";  
  21.   
  22.     final public static String PROP_OUTPUTS = "OUTPUTS";  
  23.   
  24.     protected Point location = new Point(00);  
  25.   
  26.     protected String name = "Node";  
  27.   
  28.     protected boolean visible = true;  
  29.     //定义属性的编辑项  
  30.     protected IPropertyDescriptor[] descriptors = new IPropertyDescriptor[] {  
  31.             new TextPropertyDescriptor(PROP_NAME, "Name"),  
  32.             new ComboBoxPropertyDescriptor(PROP_VISIBLE, "Visible"new String[] { "true""false" }) };  
  33.     //定义模型连线的列表  
  34.     protected List outputs = new ArrayList(5);  
  35.   
  36.     protected List inputs = new ArrayList(5);  
  37.   
  38.     public void addInput(Connection connection) {  
  39.         this.inputs.add(connection);  
  40.         //当输入的连线改变后,触发结构改变的事件  
  41.         fireStructureChange(PROP_INPUTS, connection);  
  42.     }  
  43.   
  44.     public void addOutput(Connection connection) {  
  45.         this.outputs.add(connection);  
  46.       //当输出的连线改变后,触发结构改变的事件  
  47.         fireStructureChange(PROP_OUTPUTS, connection);  
  48.     }  
  49.   
  50.     public List getIncomingConnections() {  
  51.         return this.inputs;  
  52.     }  
  53.   
  54.     public List getOutgoingConnections() {  
  55.         return this.outputs;  
  56.     }  
  57.   
  58.     public void removeInput(Connection connection) {  
  59.         this.inputs.remove(connection);  
  60.         fireStructureChange(PROP_INPUTS, connection);  
  61.     }  
  62.   
  63.     public void removeOutput(Connection connection) {  
  64.         this.outputs.remove(connection);  
  65.         fireStructureChange(PROP_OUTPUTS, connection);  
  66.     }  
  67.   
  68.     public boolean isVisible() {  
  69.         return visible;  
  70.     }  
  71.   
  72.     public void setVisible(boolean visible) {  
  73.         if (this.visible == visible) {  
  74.             return;  
  75.         }  
  76.         this.visible = visible;  
  77.         firePropertyChange(PROP_VISIBLE, null, Boolean.valueOf(visible));  
  78.     }  
  79.   
  80.     public String getName() {  
  81.         return name;  
  82.     }  
  83.   
  84.     public void setName(String name) {  
  85.         if (this.name.equals(name)) {  
  86.             return;  
  87.         }  
  88.         this.name = name;  
  89.         //当模型的名字改变后,通知监听器更新名字的显示  
  90.         firePropertyChange(PROP_NAME, null, name);  
  91.     }  
  92.   
  93.     public void setLocation(Point p) {  
  94.         if (this.location.equals(p)) {  
  95.             return;  
  96.         }  
  97.         this.location = p;  
  98.       //当模型的位置改变后,通知监听器更新模型的位置  
  99.         firePropertyChange(PROP_LOCATION, null, p);  
  100.     }  
  101.   
  102.     public Point getLocation() {  
  103.         return location;  
  104.     }  
  105.   
  106.     //------------------------------------------------------------------------  
  107.     // Abstract methods from IPropertySource  
  108.   
  109.     public Object getEditableValue() {  
  110.         return this;  
  111.     }  
  112.     //得到属性编辑项  
  113.     public IPropertyDescriptor[] getPropertyDescriptors() {  
  114.         return descriptors;  
  115.     }  
  116.     //得到属性编辑项的值  
  117.     public Object getPropertyValue(Object id) {  
  118.         if (PROP_NAME.equals(id))  
  119.             return getName();  
  120.         if (PROP_VISIBLE.equals(id))  
  121.             return isVisible() ? new Integer(0) : new Integer(1);  
  122.         return null;  
  123.     }  
  124.   
  125.     public boolean isPropertySet(Object id) {  
  126.         return true;  
  127.     }  
  128.   
  129.     public void resetPropertyValue(Object id) {  
  130.   
  131.     }  
  132.     //设置属性的值  
  133.     public void setPropertyValue(Object id, Object value) {  
  134.         if (PROP_NAME.equals(id))  
  135.             setName((String) value);  
  136.         if (PROP_VISIBLE.equals(id))  
  137.             setVisible(((Integer) value).intValue() == 0);  
  138.     }  
  139. }  

    上例中实现了模型对应的属性视图,当属性被修改后,模型将会调用“fire...”方法触发相应的模型改变事件。
分享到:
评论

相关推荐

    GEF入门系列 pdf 格式资料

    - **模型-视图-控制器(MVC)**:GEF基于MVC设计模式,将图形元素的逻辑(模型)、显示(视图)和交互(控制器)分离,实现了高度可定制化和可扩展性。 - **Part和EditPart**:Part代表工作台上的一个独立组件,...

    GEF Description

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

    GEF及GMF入门学习

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

    GEF初学者开发样例

    "gefpractice"这个项目很可能是一个包含了一系列示例代码和教程的压缩包,用于帮助初学者理解并实践GEF的使用。通常,这样的项目会包括以下几个部分: - **基础示例**: 如创建基本图形,添加连接线,实现拖放功能...

    界面设计GEF应用实例

    【描述】中的"六个小例子"是指通过一系列逐步进阶的教程,帮助开发者从基础到高级理解并掌握GEF的使用。这些例子旨在帮助初学者逐步理解GEF的工作原理,以及如何利用其功能构建复杂的图形用户界面。每个例子都增加了...

    GEF-ALL-3.7+GEF-ALL-3.8+GEF_Draw2d学习资料

    2. "GEF入门系列(一、Draw2D).doc" 可能是一个逐步的教学系列,从基础的Draw2D开始,逐步引入GEF的概念和应用。 3. "如何在Eclipse3.3.1.1中安装VE,emf,GEF插件.doc" 提供了在特定版本的Eclipse中安装相关插件的步骤...

    GEF.rarGEF.rar

    标题中的"GEF.rar"可能是指“Graph Editor Framework”的压缩包文件,这通常与软件开发,尤其是图形用户界面(GUI)的设计和实现有关。GEF(Graph Editor Framework)是Eclipse项目的一部分,它提供了一个用于构建...

    GEF基础知识

    因此,要深入理解和使用GEF,了解Draw2D的基本原理和技术是非常必要的。 #### 三、GEF框架架构解析 GEF遵循经典的MVC(Model-View-Control)架构模式,各部分的作用如下: - **Model(模型)**:这部分是由开发者...

    基于gef框架Demo

    在“基于gef框架Demo”中,我们很可能会发现一系列用于展示Gef功能的示例程序。 Java是Gef框架的基础语言,它是一种广泛使用的面向对象编程语言,以其跨平台兼容性和丰富的库而闻名。Eclipse则是一个强大的集成开发...

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

    《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...

    gef-step2.rar_GEF eclipse_gef

    **gef-step2.rar**中的内容可能是这个系列教程的第二部分,通常在学习过程中,随着教程的深入,开发者会逐步接触到更多的GEF特性和实践案例。这些教程可能涵盖了如何创建新的图元类型、定义图形布局算法、实现图元...

    eclipse图形建模框架(gef)

    对于初学者来说,了解和掌握 GEF 的基本原理及使用方法是非常重要的。 #### 二、GEF 的功能介绍 GEF 提供了一系列工具和 API,使得开发者能够在 Eclipse 平台上创建自定义的图形编辑器。这些图形编辑器可以用来...

    GEF/Draw2D入门例子

    7. **书籍资源**:可能还包含了介绍GEF/Draw2D的书籍或文档,这些资源可以帮助你深入理解这两个库的工作原理和最佳实践。 ### 学习路径 学习GEF/Draw2D,你需要先掌握Java基础知识和Eclipse RCP开发环境。然后,...

    GEF-SDK-3.1.zip

    GEF 为开发者提供了模型-视图-控制器(MVC)的设计模式,使得开发者可以专注于图形编辑功能的实现,而不需要关心底层渲染和交互细节。它包括了基础的图形绘制、事件处理、工具条和菜单集成等核心功能,同时也支持...

    GEF开发实践

    ### GEF开发实践知识点解析 ...综上所述,GEF开发实践不仅需要掌握基本的工程创建和配置步骤,还需要深入理解GEF的核心概念和原理。此外,合理的代码结构和设计模式的应用对于项目的成功至关重要。

    Eclipse3.2可视化开发组件(1)

    总之,Eclipse 3.2 可视化开发组件是构建图形化应用和工具的关键组件,VE SDK 1.2.1 提供了可视化编辑器的框架和开发资源,而GEF-runtime-3.2 则是实现图形界面和编辑功能的基础。通过这两个组件,开发者可以充分...

Global site tag (gtag.js) - Google Analytics