博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SWT事件的四种写法
阅读量:6304 次
发布时间:2019-06-22

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

一.
匿名内部类写法
    
在创建SWT
中的HelloWorld
插件项目中就是用的这种写法,再次复制如下:
button.addSelectionListener(new SelectionAdapter(){
                            public void widgetSelected(SelectionEvent e){
                                     //
弹出一个对话框, MessageDialog
JFace
中的类
                                     MessageDialog.openInformation(shell,"hello","HelloWorld");
                            }
                   });
new SelectionAdapter()
创建了一个匿名内部类的对象,然后直接赋给了button
对象。它实际上是创建了一个继承于SelectionAdapter
的类,但没有给这个类命名,并直接改写了父类SelectionAdapter
widgetSelected
方法。
button
addSelectionListener(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
方法本不应该成为HelloWorld
public
方法对外公布,除非确实有这样的需要。
第一行注释说HelloWorld
也可以改为实现SelectionListener
接口,因为SelectionAdapter
实现的接口就是SelectionListener,
所以HelloWorld
继承SelectionAdapter
还是实现SelectionListener
在本质上都是一样的。看SelectionAdapter
的源代码,就会发现此类对SelectionListener
的两个方法只是做了空实现。这种设计在设计模式中被称为“缺省适配器模式”,主要目的就是为了像ButtonSelectionListener
这样的实现类少写几个方法,例如ButtionSelectionListener
直接实现SelectionListener
接口就要写两方法,但改为继承SelectionAdapter
后就可以只改写一个方法。在SWT
中还有很多这种“缺省适配器模式”的例子。
 
.
总结
以上四种写法中,匿名内部类方式写起来要方便些。但不适合事件代码较长的情形,一般多于10
行就算代码较长了。命名内部类写法从代码书写、阅读、维护以及程序的可扩展性角度来看值得推荐。外部类写法主要是为了代码重用才考虑使用,如果多个程序用到相同的事件处理代码,外部类写法就派上用场了。而第四种实现监听接口的写法比较怪异,非不得己不建议使用。
********************************************************
上接
下接
本文转自redking51CTO博客,原文链接:
http://blog.51cto.com/redking/74195
,如需转载请自行联系原作者
你可能感兴趣的文章
python购物车
查看>>
解决python2和python3的pip冲突
查看>>
面试/编程
查看>>
linux每日命令(16):head命令
查看>>
公司内部分享【富有成效的每日站会】总结
查看>>
打造一个上传图片到图床利器的插件(Mac版 开源)
查看>>
iOS横竖屏
查看>>
thinkphp判断更新是否成功
查看>>
Do While ... Loop 与 Do Until ... Loop 的区别
查看>>
【Linux】查询某个字符串出现次数
查看>>
高效使用jquery之一:请使用'On'函数
查看>>
冲刺第一周第三天
查看>>
ERP环境检测工具设计与实现 Environment Detection
查看>>
不要在构造中做太多事情,不然有时候会出现有意思的代码~
查看>>
IIS 发布网站遇到的问题
查看>>
NuGet学习笔记(2)——使用图形化界面打包自己的类库
查看>>
xcode中没有autoSizing的设置
查看>>
字符编码
查看>>
企业应用:应用层查询接口设计
查看>>
浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
查看>>