`
hqs7636
  • 浏览: 221019 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SWT事件的四种写法 (转)

阅读更多

一.匿名内部类写法
    在创建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行就算代码较长了。命名内部类写法从代码书写、阅读、维护以及程序的可扩展性角度来看值得推荐。外部类写法主要是为了代码重用才考虑使用,如果多个程序用到相同的事件处理代码,外部类写法就派上用场了。而第四种实现监听接口的写法比较怪异,非不得己不建议使用。
分享到:
评论
1 楼 xykpermit 2008-12-01  
UPUPUPUPUPUPUP

相关推荐

    JAVA SWT事件四种写法实例解析

    本文将深入探讨四种常见的Java SWT事件处理写法,并分析它们的优缺点。 ### 1. 匿名内部类写法 这是最简单也是最常见的事件处理方式,如标题和描述中所示: ```java text.addMouseListener(new MouseAdapter() { ...

    文件上传示例

    这篇博文“文件上传示例”提供了一种实现这一功能的方法,结合了前端JavaScript技术和后端处理。虽然描述中没有给出具体细节,但我们可以从标签“源码”和“工具”推测,博主可能分享了相关的代码片段和实用工具。 ...

    Eclipse_Swt_Jface_核心应用_部分19

    8.2 事件处理的常用写法 130 8.2.1 内部匿名类 130 8.2.2 内部类 130 8.2.3 实现接口的类 131 8.2.4 继承的类的方法 132 8.3 键盘事件 132 8.3.1 键盘事件程序示例 132 8.3.2 键盘事件的各种属性 134 ...

    Eclipse_+_MyEclipse_使用指南.doc

    学习事件的四种写法,理解常用事件类型,以及如何在事件处理代码中访问类的成员变量,是编写响应用户操作的GUI程序的基础。 总结,这份指南详细介绍了Eclipse和MyEclipse的安装、使用和相关插件的配置,涵盖了从...

    Eclipse从入门到精通

    了解事件的四种写法以及如何访问类中的变量,对于编写响应用户操作的代码至关重要。同时,熟悉常用的事件类型和组件方法,可以帮助开发者更好地控制和响应用户的交互。 #### SWT常用组件与容器类 从按钮、复选框、...

    eclipse插件开发指南

    事件模型有两种主要写法: - **匿名内部类**:在事件处理函数中直接定义一个匿名内部类,简洁但不易复用。 - **分离监听器类**:将事件处理逻辑封装在单独的类中,提高代码的可读性和可维护性。 以上是对Eclipse...

    java常见异常汇总

    例如,错误的查询语句可能是这样的:“SELECT p FROM Position”,而正确的写法应当是“SELECT p FROM Position p”。 **解决方案**:为了避免这种异常,应该在查询语句中为每个表指定一个别名,以便 HQL 能够正确...

    java程序员笔试题java程序员笔试题

    5. 将一个十六进制值赋给一个 long 型变量正确的写法是使用 0x 前缀。 知识点:Java 数据类型、变量赋值、十六进制数。 6. 该道题考察了 Java 中的位运算符和表达式的计算。 知识点:Java 位运算符、表达式计算、...

    java程序员面试笔试试题.pdf,这是一份不错的文件

    5. **十六进制赋值**:长整型(long)变量可以接收十六进制值,正确的写法是`long number = 0x345L;`。 6. **位运算**:在Java中,^代表按位异或操作。`6 ^ 3`的结果是2,因为6的二进制是110,3的二进制是011,异或...

    java程序员笔试题.doc

    10. SWT与JFC/Swing:`MessageBox`、`MessageDialog`是SWT(Standard Widget Toolkit)中的类,而`JDialog`属于JFC/Swing包,`DisplayMode`是Java 2D图形中的类。 11. 合法标识符:Java中合法的标识符可以包含字母...

    Java+JSP+SSH面试笔试题

    `DisplayMode`是SWT(Standard Widget Toolkit)包中的一个类,用于描述显示模式的信息,如分辨率、颜色深度等。 #### 多项选择题解析 1. **在下面的选项中合法的标识符有。** - **答案解析:** 正确答案为ADEF。...

Global site tag (gtag.js) - Google Analytics