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

事件监听器是一个特殊的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();
     }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值