11.5.4 使用内部类实现监听器
事件监听器是一个特殊的Java
对象,实现事件监听器对象有如下几种形式。
- 内部类形式:将事件监听器类定义成当前类的内部类。
- 外部类形式:将事件监听器类定义成一个外部类。
- 类本身作为事件监听器类:让当前类本身实现监听器接口或继承事件适配器
- 匿名内部类形式:使用匿名内部类创建事件监听器对象
前面示例程序中的所有事件监听器类都是内部类形式,使用内部类可以很好地复用该监听器类,如MultiListener.java
程序所示;
内部类形式的监听器类可以自由访问外部类的所有GUI
组件这也是内部类的两个优势。
11.5.5 使用外部类实现监听器
使用外部类定义事件监听器类的形式比较少见,主要有如下两个原因。
- 事件监听器通常属于特定的
GUI
界面,定义成外部类不利于提高程序的内聚性。
- 外部类形式的事件监听器不能自由访问创建
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 { 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() { 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所示的运行界面。