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

9 篇文章 0 订阅
9 篇文章 0 订阅

关键字: 同步
为了保证数据和展现的同步,必须要有一种消息通知机制,当模型被修改时通知相应的视图进行更新,下面将介绍如何实现这种消息机制。

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.    }  
当控制器监听到模型的改变事件后,将会通过视图的更新,从而实现了模型数据和视图显示的同步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值