事件监听器是一个特殊的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();
}
}
推荐阅读
- InnoDB索引优化
- 面试 - 几道编程题
- 使用Java8新增的Predicate操作集合
- Reference counted Objects (引用计数对象) - 文章翻译
- 面试-编程题
- 处理Blob类型数据()
- java|面试官想问的Java问题,都在这篇文章中了!