某F注:下面的东西基本上都是我从一本叫《Eclipse从入门到精通》的书上抄的...因为这书是从图书馆借的= =我怕以后我找不着了。。就抄下来了...除了标记出来的我的注释,都是书上的原文..
一.匿名内部类写法
例:
//addMouseListener 加入鼠标事件的监听器
text.addMouseListener(new MouseAdpter(){
public void mouseDoubleClick(MouseEvent e){
MessageDialog.openInformation(null,"","Hello World");
}
});
//=====================================//
这种写法简单方便,但是也有一些缺点:(某F注:其实看起来也很不方便..)
1.由于事件处理代码会随着组件一起分散在代码中的各个部分,不够集中,这样会导致代码阅读与维护上的不便
2.各事件的处理全部由嵌套的程序块组成,视觉上回显示有些乱。如果事件处理代码很长,也会导致阅读与维护上的不便
3.当工具栏、菜单栏等也需要处理相同的用户行为时,无法重用事件中的处理代码,导致代码不够简洁
二.命名内部类写法
例:
public class HelloWorld{
public static void main(String args[]){
.......
Text text=new Text(shell,SWT.BORDER);
//加入事件监听器,并用下面代码所定义的内部类生成一个对象
text.addMouseListener(new MyMouseDoubleClick());
.......
}
//定义内部类
private static final class MyMouseDoubleClick extends MouseAdapter{
public void mouseDoubleClick(MouseEvent e){
MessageDialog.openInformation(null,"","Hello World");
}
}
}
三.外部类写法
这种写法和命名内部类有些相似,只不过将MyMouseDoubleClick类从HelloWorld.java中拿出去,单独写成一个类文件。这种写法有和命名内部类一样的有点,但因为要单独写成一个文件,写起来会麻烦一些,实现代码部分如下:
//文件1
public class HelloWorld{
public static void main(String args[]){
...
text.addMouseListener(new MyMouseDoubleClick());
...
}
}
//文件2
public class MyMouseDoubleClick extends MouseAdapter{
public void mouseDoubleClick(MouseEvent e){
MessageDialog.openInformation(null,"","Hello World");
}
}
四.实现监听接口的写法
(某F:我最常用的办法...)
将HelloWorld类实现MouseListener接口,这样类本身就成了一个监听器,使得加入监听器的代码可以更简洁。这种方法适合加入监听器的组件较多,并且要求监听器的事件处理代码可以被组件共用。这种方式还有一个要注意的地方:事件方法和其他方法混合在一起,容易引起误读。所以应该在事件方法前加入详细的注释说明。
实现MouseListener接口要写的事件方法多一些,当然没用的事件方法可以空实现。如果继承MouseListener接口的适配器MouseAdapter,则指写需要的方法就行了。但是另外要注意,只有接口才能有多继承的特性,所以如果HelloWorld已经是某个类的子类,就只能用实现接口的方式,而不能继承接口的适配器了。
示例代码如下:
public class HelloWorld extends MouseAdapter{//或者implements MouseListener
public static void main(String args[]){
new HelloWorld().createContent();
}
private void createContent(){
...
text.addMouseListener(this);
...
}
public void mouseDoubleClick(MouseEvent e){
MessageDialog.openInformation(null,"","Hello World");
}
}
总结
匿名内部类方式写起来要方便些,但不适合事件代码太长、太多的情况。从代码书写、阅读、维护以及程序的可拓展性角度来看,明明内部类写法最为值得推荐。外部类的书写主要是为了代码重用才考虑使用,如果包外的类要用到此事件处理代码,此时外部类就派上用场了。而第四种写法,要求组建都可以共用事件代码时才能使用(某F注:或者多加几个if(e.getSource()==XXX)...反正我一直这么干……)