SWT事件的四种写法

简介:
一. 匿名内部类写法
     在创建SWT中的HelloWorld插件项目中就是用的这种写法,再次复制如下:
button.addSelectionListener(new SelectionAdapter(){
                            public void widgetSelected(SelectionEvent e){
                                     // 弹出一个对话框, MessageDialog JFace 中的类
                                     MessageDialog.openInformation(shell,"hello","HelloWorld");
                            }
                   });
new SelectionAdapter()创建了一个匿名内部类的对象,然后直接赋给了button对象。它实际上是创建了一个继承于SelectionAdapter的类,但没有给这个类命名,并直接改写了父类SelectionAdapterwidgetSelected方法。
buttonaddSelectionListener(SelectionListener listener)方法,实际上是把一个事件监听器SelectionListener注册进来。当button被单击时,底层就会检查button是否注册了相对就的监听器,如果有,底层就会调用监听器的相应事件方法(如widgetSelected)。这种设计在设计模式中被称为“观察者模式”。
事件代码使用匿名内部类的写法比较简单方便,但也要注意它的不足。如下:
*由于事件处理代码会随着组件一起分散在代码中的各个部分,不够集中,这样会导致代码阅读与维护上的不便。
*各事件的处理全部由嵌套的程序块组成,视觉上显得有些散乱。如果事件处理代码很长,也会导致阅读与维护上的不便。
*对于工具栏、菜单栏等可以复用事件处理的界面组件,使用匿名内部类的写法将无法复用事件处理代码。
 
二.              命名内部类写法
事件代码采用命名内部类的方式,可以解决匿名内部类存在的问题。首先,事件处理代码都要集中在一起,并且事件类具有了有意义的名称,程序更容易阅读与维护;另外单个的事件处理程序也可以被工具栏、菜单栏等重用。代码如下:
Public class HelloWord{
Public static void main(String[] args){
……
Button.addSelectionListener (new ButtonSelectionListener());// 按钮
//menuitem.addSelectionListener(new ButtonSelectionListener);// 菜单
        ……
}
// 定义一个内部类
Private static final class ButtonSelectionListener extends SelectionAdapter{
       Public void widgetSelected(SelectionEvent e){
MessageDialog.openInformation(shell,”hello”,”HelloWord”);
       }
}
}
 
三.外部类写法
这种写法和命名内部类有些地方相似,不同的是将ButtonSelectionListener单独写成一个Java文件。这样其他的SWT程序也能够共用这个Listener类,缺点是增加了一个源文件ButtonSelectionListener.java。代码如下:
// 文件 1 HelloWorld.java
Public class HelloWorld{
Public static void main(String[] args){
    ……
    Button.addSelectionListener(new ButtonSelectionListener());
    ……
}
}
 
// 文件 2 ButtonSelectionListener.java
Public class ButtonSelectionListener extends SelectionAdapter{
public void widgetSelected(SelectionEvent e){
    MessageDialog.openInformation(shell,”hello”,”HelloWorld”);
}
}
 
四.实现监听接口的写法
如果让HelloWord类本身继承SelectionAdapter,这样HelloWorld类自己就成了一个像ButtonSelectionListener那样的监听器,代码如下:
Public class HelloWorld extends SelectionAdapter{// implements SelectionListener
Public static void main(String[] args){
……
Button.addSelectionListener(new HelloWorld());
……
}
@Override
Public void widgetSelected(SelectionEvent e){
    MessageDialog.openInformation(shell,”hello”,”HelloWorld”);
}
}
这种写法乍一看起来挺简洁紧凑,但事件方法和HelloWorld类的其他方法混杂在了一起,容易引起误读。而且像widgetSelected方法本不应该成为HelloWorldpublic方法对外公布,除非确实有这样的需要。
第一行注释说HelloWorld也可以改为实现SelectionListener接口,因为SelectionAdapter实现的接口就是SelectionListener,所以HelloWorld继承SelectionAdapter还是实现SelectionListener在本质上都是一样的。看SelectionAdapter的源代码,就会发现此类对SelectionListener的两个方法只是做了空实现。这种设计在设计模式中被称为“缺省适配器模式”,主要目的就是为了像ButtonSelectionListener这样的实现类少写几个方法,例如ButtionSelectionListener直接实现SelectionListener接口就要写两方法,但改为继承SelectionAdapter后就可以只改写一个方法。在SWT中还有很多这种“缺省适配器模式”的例子。
 
.总结
以上四种写法中,匿名内部类方式写起来要方便些。但不适合事件代码较长的情形,一般多于10行就算代码较长了。命名内部类写法从代码书写、阅读、维护以及程序的可扩展性角度来看值得推荐。外部类写法主要是为了代码重用才考虑使用,如果多个程序用到相同的事件处理代码,外部类写法就派上用场了。而第四种实现监听接口的写法比较怪异,非不得己不建议使用。
********************************************************
下接




本文转自redking51CTO博客,原文链接: http://blog.51cto.com/redking/74195 ,如需转载请自行联系原作者
相关文章
|
4月前
|
Java API 容器
java和VB中按键事件处理:解析 KeyCode、KeyAscii; KeyDown/KeyUp/KeyPress 的关系区别及应用
java和VB中按键事件处理:解析 KeyCode、KeyAscii; KeyDown/KeyUp/KeyPress 的关系区别及应用
|
4月前
|
JavaScript 前端开发
如何用class绑定事件监听
如何用class绑定事件监听
45 1
|
8月前
|
API 数据安全/隐私保护 Android开发
【SWT】常用代码及接口(一)
【SWT】常用代码及接口(一)
125 0
|
Java Android开发 C++
Framework 全局监听屏幕点击事件 INPUT_EVENT_INJECTION
Framework 全局监听屏幕点击事件 INPUT_EVENT_INJECTION
226 0
|
Java
JAVA中如何全局监听鼠标事件
JAVA中如何全局监听鼠标事件
207 0
|
前端开发 JavaScript
element组件的属性、事件和方法怎么使用
我们在使用element组件的时候,经常会使用到组件的属性、事件和方法,但对于第一次接触element组件的小白来说,由于没有代码示例,所以不知道怎么使用组件的属性、事件和方法是很常见的情况,所以本文将教会大家怎么去使用element组件的属性、事件和方法
302 0
element组件的属性、事件和方法怎么使用
|
小程序 JavaScript
小程序点击事件,添加class样式
小程序点击事件,添加class样式
558 0
小程序点击事件,添加class样式
|
Java Spring 微服务
JFinal-event v2.3.0 发布,简化 Event 事件类
说明 JFinal-event 2.x 参考 Spring 4.2.x 中 Event 的使用方式而生,为 JFinal 用户带来更多方便。其核心目标是深层次解耦,为您节约更多时间,去陪恋人、家人和朋友 :) 年初 @idoz 提议实现类似 Spring 4.2 里的 PayloadApplicationEvent,其实我早就有此想法,一直没有抽出时间来折腾。
1959 0
UGUI中Event Trigger的基本用法
UGUI中Event Trigger的基本用法 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) C...
1226 0