GEF的模型只与控制器打交道,而不知道任何与视图有关的东西。
1.模型的功能
在GEF框架中,模型(Model)是非常简单的一部分,用户可把模型理解成一个简单的可持久化的实体。但为了能让控制器知道模型的变化,应该把控制器作为事件监听者注册在模型中,当模型发生变化时,就触发相应的事件给控制器,后者负责通知各个视图进行更新。
2.模型的实现
典型的模型对象会包含PropertyChangeSupport类型的成员变量,用来触发事件,通知监听器即控制器。一般来说,模型会实现一个基类,用来封装事件机制,主要包括添加监听器、删除监听器,以及模型属性改变触发的相应事件,代码如下:
java 代码
- package com.example.model;
-
- import java.beans.PropertyChangeListener;
- import java.beans.PropertyChangeSupport;
- import java.io.Serializable;
-
- public abstract class Element implements Cloneable, Serializable {
-
- PropertyChangeSupport listeners = new PropertyChangeSupport(this);
-
- public void addPropertyChangeListener(PropertyChangeListener l) {
- listeners.addPropertyChangeListener(l);
- }
-
- protected void firePropertyChange(String prop, Object old, Object newValue) {
- listeners.firePropertyChange(prop, old, newValue);
- }
-
- protected void fireStructureChange(String prop, Object child) {
- listeners.firePropertyChange(prop, null, child);
- }
-
-
-
-
-
-
- public void removePropertyChangeListener(PropertyChangeListener l) {
- listeners.removePropertyChangeListener(l);
- }
-
- }
另外,当用户希望通过属性视图编辑模型属性时,模型要实现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 代码
- package com.example.model;
-
- import java.util.ArrayList;
- import java.util.List;
-
- import org.eclipse.draw2d.geometry.Point;
- import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
- import org.eclipse.ui.views.properties.IPropertyDescriptor;
- import org.eclipse.ui.views.properties.IPropertySource;
- import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
- public class Node extends Element implements IPropertySource {
-
- final public static String PROP_LOCATION = "LOCATION";
-
- final public static String PROP_NAME = "NAME";
-
- final public static String PROP_VISIBLE = "VISIBLE";
-
- final public static String PROP_INPUTS = "INPUTS";
-
- final public static String PROP_OUTPUTS = "OUTPUTS";
-
- protected Point location = new Point(0, 0);
-
- protected String name = "Node";
-
- protected boolean visible = true;
-
- protected IPropertyDescriptor[] descriptors = new IPropertyDescriptor[] {
- new TextPropertyDescriptor(PROP_NAME, "Name"),
- new ComboBoxPropertyDescriptor(PROP_VISIBLE, "Visible", new String[] { "true", "false" }) };
-
- protected List outputs = new ArrayList(5);
-
- protected List inputs = new ArrayList(5);
-
- public void addInput(Connection connection) {
- this.inputs.add(connection);
-
- fireStructureChange(PROP_INPUTS, connection);
- }
-
- public void addOutput(Connection connection) {
- this.outputs.add(connection);
-
- fireStructureChange(PROP_OUTPUTS, connection);
- }
-
- public List getIncomingConnections() {
- return this.inputs;
- }
-
- public List getOutgoingConnections() {
- return this.outputs;
- }
-
- public void removeInput(Connection connection) {
- this.inputs.remove(connection);
- fireStructureChange(PROP_INPUTS, connection);
- }
-
- public void removeOutput(Connection connection) {
- this.outputs.remove(connection);
- fireStructureChange(PROP_OUTPUTS, connection);
- }
-
- public boolean isVisible() {
- return visible;
- }
-
- public void setVisible(boolean visible) {
- if (this.visible == visible) {
- return;
- }
- this.visible = visible;
- firePropertyChange(PROP_VISIBLE, null, Boolean.valueOf(visible));
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- if (this.name.equals(name)) {
- return;
- }
- this.name = name;
-
- firePropertyChange(PROP_NAME, null, name);
- }
-
- public void setLocation(Point p) {
- if (this.location.equals(p)) {
- return;
- }
- this.location = p;
-
- firePropertyChange(PROP_LOCATION, null, p);
- }
-
- public Point getLocation() {
- return location;
- }
-
-
-
-
- public Object getEditableValue() {
- return this;
- }
-
- public IPropertyDescriptor[] getPropertyDescriptors() {
- return descriptors;
- }
-
- public Object getPropertyValue(Object id) {
- if (PROP_NAME.equals(id))
- return getName();
- if (PROP_VISIBLE.equals(id))
- return isVisible() ? new Integer(0) : new Integer(1);
- return null;
- }
-
- public boolean isPropertySet(Object id) {
- return true;
- }
-
- public void resetPropertyValue(Object id) {
-
- }
-
- public void setPropertyValue(Object id, Object value) {
- if (PROP_NAME.equals(id))
- setName((String) value);
- if (PROP_VISIBLE.equals(id))
- setVisible(((Integer) value).intValue() == 0);
- }
- }
上例中实现了模型对应的属性视图,当属性被修改后,模型将会调用“fire...”方法触发相应的模型改变事件。
分享到:
相关推荐
- **模型-视图-控制器(MVC)**:GEF基于MVC设计模式,将图形元素的逻辑(模型)、显示(视图)和交互(控制器)分离,实现了高度可定制化和可扩展性。 - **Part和EditPart**:Part代表工作台上的一个独立组件,...
为了实现视图与数据模型之间的动态更新,GEF 引入了观察者模式。当数据模型发生变化时,所有依赖于该模型的视图都会自动更新,反之亦然。这样就确保了数据的一致性和准确性。 #### 四、GEF 的核心组件 GEF 包含多...
### GEF及GMF入门学习知识点详解 #### 一、GEF与GMF概述 - **GEF**(Graphical Editing Framework)是Eclipse提供的一个用于构建图形编辑器的框架,它提供了一套完整的API来支持图形化界面的创建、编辑和管理。GEF...
"gefpractice"这个项目很可能是一个包含了一系列示例代码和教程的压缩包,用于帮助初学者理解并实践GEF的使用。通常,这样的项目会包括以下几个部分: - **基础示例**: 如创建基本图形,添加连接线,实现拖放功能...
【描述】中的"六个小例子"是指通过一系列逐步进阶的教程,帮助开发者从基础到高级理解并掌握GEF的使用。这些例子旨在帮助初学者逐步理解GEF的工作原理,以及如何利用其功能构建复杂的图形用户界面。每个例子都增加了...
2. "GEF入门系列(一、Draw2D).doc" 可能是一个逐步的教学系列,从基础的Draw2D开始,逐步引入GEF的概念和应用。 3. "如何在Eclipse3.3.1.1中安装VE,emf,GEF插件.doc" 提供了在特定版本的Eclipse中安装相关插件的步骤...
标题中的"GEF.rar"可能是指“Graph Editor Framework”的压缩包文件,这通常与软件开发,尤其是图形用户界面(GUI)的设计和实现有关。GEF(Graph Editor Framework)是Eclipse项目的一部分,它提供了一个用于构建...
因此,要深入理解和使用GEF,了解Draw2D的基本原理和技术是非常必要的。 #### 三、GEF框架架构解析 GEF遵循经典的MVC(Model-View-Control)架构模式,各部分的作用如下: - **Model(模型)**:这部分是由开发者...
在“基于gef框架Demo”中,我们很可能会发现一系列用于展示Gef功能的示例程序。 Java是Gef框架的基础语言,它是一种广泛使用的面向对象编程语言,以其跨平台兼容性和丰富的库而闻名。Eclipse则是一个强大的集成开发...
《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...
**gef-step2.rar**中的内容可能是这个系列教程的第二部分,通常在学习过程中,随着教程的深入,开发者会逐步接触到更多的GEF特性和实践案例。这些教程可能涵盖了如何创建新的图元类型、定义图形布局算法、实现图元...
对于初学者来说,了解和掌握 GEF 的基本原理及使用方法是非常重要的。 #### 二、GEF 的功能介绍 GEF 提供了一系列工具和 API,使得开发者能够在 Eclipse 平台上创建自定义的图形编辑器。这些图形编辑器可以用来...
7. **书籍资源**:可能还包含了介绍GEF/Draw2D的书籍或文档,这些资源可以帮助你深入理解这两个库的工作原理和最佳实践。 ### 学习路径 学习GEF/Draw2D,你需要先掌握Java基础知识和Eclipse RCP开发环境。然后,...
GEF 为开发者提供了模型-视图-控制器(MVC)的设计模式,使得开发者可以专注于图形编辑功能的实现,而不需要关心底层渲染和交互细节。它包括了基础的图形绘制、事件处理、工具条和菜单集成等核心功能,同时也支持...
### GEF开发实践知识点解析 ...综上所述,GEF开发实践不仅需要掌握基本的工程创建和配置步骤,还需要深入理解GEF的核心概念和原理。此外,合理的代码结构和设计模式的应用对于项目的成功至关重要。
总之,Eclipse 3.2 可视化开发组件是构建图形化应用和工具的关键组件,VE SDK 1.2.1 提供了可视化编辑器的框架和开发资源,而GEF-runtime-3.2 则是实现图形界面和编辑功能的基础。通过这两个组件,开发者可以充分...