11.5.4 使用内部类实现监听器

11.5.4 使用内部类实现监听器

事件监听器是一个特殊的Java对象,实现事件监听器对象有如下几种形式。

  • 内部类形式:将事件监听器类定义成当前类的内部类。
  • 外部类形式:将事件监听器类定义成一个外部类。
  • 类本身作为事件监听器类:让当前类本身实现监听器接口或继承事件适配器
  • 匿名内部类形式:使用匿名内部类创建事件监听器对象

前面示例程序中的所有事件监听器类都是内部类形式,使用内部类可以很好地复用该监听器类,如MultiListener.java程序所示;
内部类形式的监听器类可以自由访问外部类的所有GUI组件这也是内部类的两个优势。

11.5.5 使用外部类实现监听器

使用外部类定义事件监听器类的形式比较少见,主要有如下两个原因。

  • 事件监听器通常属于特定的GUⅠ界面,定义成外部类不利于提高程序的内聚性。
  • 外部类形式的事件监听器不能自由访问创建GUI界面类中的组件,编程不够简洁。

但如果某个事件监听器确实需要被多个GUI界面所共享,而且主要是完成某种业务逻辑的实现,则可以考虑使用外部类形式来定义事件监听器类。

程序示例 外部类作为事件监听器

下面程序定义了一个外部类作为事件监听器类,该事件监听器实现了发送邮件的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.awt.*;
import java.awt.event.*;

public class MailerListener implements ActionListener {
// 该TextField文本框用于输入发送邮件的地址
private TextField mailAddress;

public MailerListener() {
}

public MailerListener(TextField mailAddress) {
this.mailAddress = mailAddress;
}

public void setMailAddress(TextField mailAddress) {
this.mailAddress = mailAddress;
}

// 实现发送邮件
public void actionPerformed(ActionEvent e) {
System.out.println("程序向“" + mailAddress.getText() + "”发送邮件...");
// 发送邮件的真实实现
}
}

上面的事件监听器类没有与任何GUI界面耦合,创建该监听器对象时传入一个TextField对象,该文本框里的字符串将被作为收件人地址。
下面程序使用了该事件监听器来监听窗口中的按钮。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.awt.*;
import java.awt.event.*;

public class SendMailer {
private Frame f = new Frame("测试");
private TextField tf = new TextField(40);
private Button send = new Button("发送");

public void init() {
// 使用MailerListener对象作为事件监听器
send.addActionListener(new MailerListener(tf));
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.add(tf);
f.add(send, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}

public static void main(String[] args) {
new SendMailer().init();
}
}

上面程序为“发送”按钮添加事件监听器时,将该窗口中的TextField对象传入事件监听器,从而允许事件监听器访问该文本框里的内容。运行上面程序,会看到如图11.23所示的运行界面。
这里有一张图片