前文回顾:

插件学习篇

简单的建立插件工程以及模型文件分析

利用扩展点,开发透视图

SWT编程须知

SWT简单控件的使用与布局搭配

SWT复杂空间与布局搭配

SWT布局详解

IPreferenceStore使用详解

编辑器代码着色

10 JFace开发

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

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

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

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

  例如下面这个小例子:

class FocusedCountry{
List<IListener> 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();
...
}

【插件开发】—— 11 窃听风云(Java事件监听原理-GEF实例讲解)的更多相关文章

  1. java 事件监听 - 鼠标

    java 事件监听 - 鼠标 //事件监听 //鼠标事件监听 //鼠标事件监听有两个实现接口 //1.MouseListener 普通的鼠标操作 //2.MouseMotionListener 鼠标的 ...

  2. java 事件监听 - 键盘

    java 事件监听 - 键盘 //事件监听 //键盘事件监听,写了一个小案例,按上下左右,改变圆形的位置,圆形可以移动 import java.awt.*; import javax.swing.*; ...

  3. java 事件监听 - 控件

    java 事件监听 //事件监听 //事件监听,写了一个小案例,点击按钮改变面板的颜色. import java.awt.*; import javax.swing.*; import java.aw ...

  4. java事件监听机制

    1.简单的事件监听 package demo2; /* * java事件监听机制 */ import java.awt.*; import javax.swing.*; import java.awt ...

  5. Java事件监听的四种实现方式

    1.事件对象: 一般继承自java.util.EventObject对象,由开发者自行定义. 2.事件源: 就是触发事件的源头,不同的事件源会触发不同的事件类型. 3.事件监听器: 事件监听器负责监听 ...

  6. java事件监听机制2

    今天早上的两点收获: 1.addActionListener(其中的setActionCommand函数就是要对对象进行唯一性的标记,便于消息传来后进行处理.理论上actionlistener可以全部 ...

  7. JAVA事件监听机制的实现

    今天学习了java的事件编程机制,略有体会,先在此记下心得. 第一,首先明确几个概念. 事件源:一个产生或者触发事件的对象.事件:承载事件源状态改变时的信息对象.事件监听器接口:实际上就是一个类,该类 ...

  8. Java事件监听机制与观察者设计模式

    一. Java事件监听机制 1. 事件监听三要素: 事件源,事件对象,事件监听器 2. 三要素之间的关系:事件源注册事件监听器后,当事件源上发生某个动作时,事件源就会调用事件监听的一个方法,并将事件对 ...

  9. JAVA事件监听机制学习

    //事件监听机制 import java.awt.*; import java.awt.event.*; public class TestEvent { public static void mai ...

随机推荐

  1. tomcat启动提示java.lang.UnsatisfiedLinkError: D:\soft\devTool\apache-tomcat-7.0.57\bin\tcnative-1.dll: C

    https://blog.csdn.net/a274360781/article/details/52411984

  2. hdu4085(斯坦纳树)

    题意: 给你n,m,k ,分别表示有n个点,m条边,每条边有一个权值,表示修复这条边需要的代价,从前k个点中任取一个使其和后k个点中的某一个点,通过边连接,并且必须是一一对应,问最小的代价是多少. 分 ...

  3. hexo博客搭建及其美化

    ###1.GitHub创建个人仓库 登录到GitHub,如果没有GitHub帐号,使用你的邮箱注册GitHub帐号:Build software better, together 点击GitHub中的 ...

  4. Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自己主动填入功能结合实例)

    用户注冊或者找回password时通常会用到短信验证功能.这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注冊用户.获取SD ...

  5. Deepin-安装php

    点击即可:下载:PHP5.6 下载完后执行下面这条shell命令即可完成安装 文件保存为:php_install.sh ,运行时:sh php_install.sh .tar.bz2 cd php- ...

  6. HTML5裁剪图片并上传至服务器实现原理讲解

    HTML5裁剪图片并上传至服务器实现原理讲解   经常做项目需要本地上传图片裁剪并上传服务器,比如会议头像等功能,但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁 ...

  7. create-react-app 使用 webpack 打包压缩失败

    问题,正常 npm run build 打包后,发现打包后的文件异常大,有 > 20M 的大小 分析, 1.起初以为是代码本身过大的原因导致的,所以一直在想如何进行代码拆分使得文件能尽可能的小, ...

  8. android通过adb wireless的使用

    转自:http://www.cnblogs.com/Androider123/p/3848415.html?utm_source=tuicool 开发android程序,总是需要插拔插拔的,usb口都 ...

  9. 关于前端js拼接字符串的一点小经验

    1.今天在做项目的时候遇到一个问题,就是使用onclick="xxx()"  点击事件的时候,参数如果为全数字就会出现点击无反应的问题.但是当参数为字符串或者动态内容的时候就会出现 ...

  10. js常用操作事件

    触发描述 方法 用法 点击 onclick="method();"   变换 onchange="testChange();"   双击 ondblclick= ...