实现事件监听器对象的几种形式()

事件监听器是一个特殊的java对象,实现事件监听器对象有如下几种形式:
内部类形式:将事件监听器定义为当前类的内部类(如前面示例程序都是内部类的形式)
外部类形式:将事件监听器定义成一个外部类
类本身作为事件监听器类:让当前类本身实现监听器接口或继承事件适配器
匿名内部类形式:使用匿名内部类创建监听器对象。
——————————————————————————————————————————————
使用外部类实现监听器:
使用外部类实现监听器比较少见,主要有两个原因:
(1)事件监听器通常属于特定的GUI页面,定义成外部类不利于提高程序的内聚性
(2)外部类形式的监听器不能自由访问多个GUI界面类的组件,编程不够简洁。
但是,当某个事件监听器确实需要被多个GUI界面所共享,而且主要是完成某种业务逻辑的实现,则可以考虑使用外部类的形式定义事件监听器。
//下面程序定义了一个外部类作为事件监听器类,该事件监听器类实现了发送邮件的功能:

package com.zou; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MailerListener implements ActionListener { private TextField mailAdress; public MailerListener() {} public MailerListener(TextField mailAdress) { this.mailAdress = mailAdress; } public TextField getMailAdress() { return mailAdress; } public void setMailAdress(TextField mailAdress) { this.mailAdress = mailAdress; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.out.println("sending mail to '" + mailAdress.getText() + ".'\n"); } }

//下面程序使用了该事件监听器来监听窗口中的按钮(把这两部分代码放在同一个包下)package com.zou; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.TextField; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class AwtTest extends WindowAdapter { // 类自己监听自己的组件 @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub // super.windowClosing(e); System.exit(0); } public void init() { Frame f = new Frame("Sending Mail Test"); TextField tf = new TextField(40); Button btn = new Button("send"); f.addWindowListener(this); btn.addActionListener(new MailerListener(tf)); f.add(tf); f.add(btn, BorderLayout.SOUTH); f.pack(); f.setVisible(true); } public static void main(String[] args) { new AwtTest().init(); } }

类 本身作为事件监听器类:
类本身作为事件监听器类这种形式使用GUI界面类直接作为监听器类,可以直接在GUI界面类中定义事件处理器方法,这种方式比较简洁,是早期AWT编程喜欢采用的形式,但是这种方式有两个缺点:
a.这种形式可能造成混乱的程序结构,GUI界面的主要职责是完成界面的初始化工作,所以降低了程序的可读性
b.如果GUI界面类需要继承事件适配器,将会导致该GUI界面类不能继承其他父类。
//下面程序使用GUI界面类作为事件监听器类:
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//GUI界面类继承WindowAdapter作为界面监听器类
public class SimpleEventHandler extends WindowAdapter{
Frame f=new Frame(“类本身事件监听器”);
TextArea ta=new TextArea(6,60);
public void init(){
//将该类的默认对象作为事件监听器对象
f.addWindowListener(this);
f.add(ta);
f.pack();
f.setVisible(true);
} //GUI界面直接包含事件处理器方法 public void windowClosing(WindowEvent e){ System.out.println("用户关闭窗口"); System.exit(0); } public static void main(String[] args){ new SimpleEventHandler().init(); }

}
匿名内部类实现监听器:
(1)大部分时候, 事件处理器都没有复用价值(可复用代码通常会抽象成业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更加合适。实际上,这是目前使用最广泛的事件监听器形式。
【实现事件监听器对象的几种形式()】示例代码:
import java.awt.Frame; import java.awt.TextArea; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class AnonymousEventHandler{ Frame f = new Frame("测试"); TextArea ta=new TextArea(6,40); public void init(){ //以匿名内部类形式创建事件监听器对象 f.addWindowListener(new WindowAdapter() { //实现事件处理方法 public void windowClosing(WindowEvent e){ System.out.println("用户试图关闭窗口"); System.exit(0); } }); f.add(ta); f.pack(); f.setVisible(true); } public static void main(String[] args){ new AnonymousEventHandler().init(); } }

    推荐阅读