博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【插件开发】—— 11 窃听风云(Java事件监听原理-GEF实例讲解)
阅读量:6236 次
发布时间:2019-06-22

本文共 3699 字,大约阅读时间需要 12 分钟。

前文回顾:

10

  事件的监听,是插件开发中的重要环节,每一次的点击或者按键都有可能触发某种事件的响应,那么是如何实现的呢?

  对于某种被监听模型,通常需要添加一个监听队列

  监听者需要通过某种方式,加入到这个监听队列中

  当这个模型在特定的情况下触发监听事件后,会产生一个事件的响应,这个响应使得监听队列中的每个监听者都触发响应的操作

  例如下面这个小例子:

class FocusedCountry{    List
listener = new ArrayList(); public void addListener(IListener lis){ listener.add(lis); } //移除监听者 public void removeListener(IListener lis){ listener.remove(lis); } //触发监听事件 protected void fireChange(String message){ for(IListener lis : listener){ lis.noticedChange(message); } }}

  这个被监听的对象,有一个监听队列,所有对它感兴趣的人都会加入到这个监听队列中。因此主要有三个函数,加入到队列中,从队列离开,以及本身的一个触发函数。

interface IListener{    public void noticedChange(String message);}class DevelopedCountry implements IListener{    public void noticedChange(String message) {        System.out.println("noticed the change:"+message);    }}

  上面实现了一个监听的接口,只要实现了这个接口的类,都可以添加到队列中。

public class ListenTest {    public static void main(String[] args) {        DevelopedCountry America = new DevelopedCountry();        FocusedCountry China = new FocusedCountry();        FocusedCountry NorthKorea = new FocusedCountry();        China.addListener(America);        NorthKorea.addListener(America);        China.fireChange("登月!");        NorthKorea.fireChange("原子弹造好了,该去哪扔呢!");    }}

  调用结果如下,所有的事件都被监听者接收到了。

noticed the change:登月!noticed the change:原子弹造好了,该去哪扔呢!

 

  那么GEF中是如何使用的呢?

  GEF是一种MVC标准的架构,它的模型负责实现这个监听队列,而Control负责接收监听,进行响应,从而改变View的模型

  因此,一般的Model都会继承一个自定义的虚类,这个虚类中包含了一个监听队列,以及上面提到的三种函数。

public class AbstractModel implements Serializable{  private PropertyChangeSupport listeners = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener listener) {  listeners.addPropertyChangeListener(listener); } public void firePropertyChange(String propName, Object oldValue,Object newValue) {  listeners.firePropertyChange(propName, oldValue, newValue); } public void removePropertyChangeListener(PropertyChangeListener listener) {  listeners.removePropertyChangeListener(listener); }}

  继承这个类后,需要某些事件进行触发监听,一般情况下,模型都会对应一些属性视图,属性视图需要继承IPropertySource接口。并重写下面的方法。

public IPropertyDescriptor[] getPropertyDescriptors() {  return new IPropertyDescriptor[] {    new PropertyDescriptor(P_TABLE_NAME, "table_name"), } public Object getPropertyValue(Object id) {  if (id == P_TABLE_NAME) {   return getPhysicalName();  }  return null; } public boolean isPropertySet(Object id) {  if (id == P_TABLE_NAME) {   return true;  }  return false; } public void setPropertyValue(Object id, Object value) {  if (id == P_TABLE_NAME) {   seName((String) value);  } }

  属性视图上的属性发生改变时,一般是在Set值的时候会触发这个firechange,最后触发到listners里面的firePropertyChange函数。

public void setXXXlName(String xxxName) {      this.xxxName = xxxName;      firePropertyChange(P_XXX_NAME, null, xxxName); }

  这里是一个插件开发遗留的习惯,就是会把每一个事件使用一个static的字符串进行标记。函数会产生一个PropertyChange的事件。

  这样模型部分的监听就搞定了,下面要进行的是监听者的添加了。

  这里监听者需要实现PropertyChangeListener接口,并在适合的时机添加到监听队列中,由于这部分的代码在Editpart中,GEF的每一个Editpart都对应了一个Model,因此通过简单的getModel方法就可以获取它对应的模型对象,再调用模型对象的addListener等方法添加到监听队列中就OK了。

public void activate() {  if (isActive()) {   return;  }  super.activate();  ((TableModel) getModel()).addPropertyChangeListener(this); } public void deactive() {  if (!isActive()) {   return;  }  super.deactivate();  ((TableModel) getModel()).removePropertyChangeListener(this); }

  一般来说都是在这两个函数内,因为这两个函数相当于处于 一般函数的 构造函数 和 析构函数的 执行位置。

  添加完监听队列,需要实现一下PropertyChangeListener里面的PropertyChange方法,这个方法传递一个参数,通过这个参数可以获取上面最开始设定的字符串,从而判断是模型的哪个时间发生了响应。

public void propertyChange(PropertyChangeEvent evt) {  if (evt.getPropertyName().equals(TableModel.P_TABLE_NAME))   refreshVisuals();   ...  }

 

转载地址:http://bgwia.baihongyu.com/

你可能感兴趣的文章
商用车诊修服务商“瑞修得”获1500万元Pre-A轮融资
查看>>
过滤器实栗 登录检测
查看>>
javaUtil类
查看>>
阿里云轻量应用服务器怎么绑定域名?
查看>>
HTML+CSS静态博客
查看>>
分布式熔断、限流与服务保护:深入 Hystrix 原理及使用
查看>>
简短而有效的python queue队列解释
查看>>
深度解析大快DKadoop大数据运维管理平台功能
查看>>
java短信接口-单条短信接口
查看>>
Confluence 6 示例 - https://confluence.atlassian.com/
查看>>
艺赛旗荣获“2018年HFS热门供应商”,助力企业搭建“智能生态系统”
查看>>
[Leetcode] Invert Binary Tree 翻转二叉树
查看>>
经纬度编码方法推荐-plus code简介
查看>>
Apache OpenMeetings 5.0.0-M1 发布,视频会议系统
查看>>
正则表达式(一):常用元字符
查看>>
Linux CentOS查看硬件信息大全
查看>>
javascript发送验证码
查看>>
javascript获取当前的时间戳
查看>>
生成若干个随机数等于某个指定的和
查看>>
分布式-- WebSocket 全双工通讯
查看>>