Java 事件适配器 Adapter
事件适配器Adapters
在上一篇文章中:
http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html
第二个例子中,可以看到要实现相应的事件监听器接口,就必须实现其中的所有方法。
有的接口中包含多个方法(多个事件处理器),而有时我们只需要其中的一两个,这时候其他方法就只是空实现。
为简化编程,JDK针对大多数事件监听器接口定义了相应的实现类,我们称之为事件适配器(Adapter)类。
在适配器类中,实现了相应监听器接口的所有方法,但不做任何事情,即这些Adapter类中的方法都是空的。
只要继承适配器类,就等于实现了相应的监听器接口。
如果要对某类事件的某种情况进行处理,只要覆盖相应的方法就可以了,其他的方法再也不用简单实现了。
所以你定义的Listener可以继承Adapter类,而且只需重写你所需要的方法。
但是要注意适配器这里用的是继承extends,而Java是单继承的机制。如果想用作事件监听器的类已经继承了别的类,就不能再继承适配器了,只能去实现事件监听器接口了。
程序实例
将上文中的例子用适配器重新实现以下,可以看到少了很多空方法。

package com.learnjava.awt; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.Label; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.sql.Date; public class MyAdapterTest extends MouseAdapter { private Frame frame; private Label label; private Button button; private TextField textField; public void go() { frame = new Frame("My Frame"); // 加上窗口监听器,其中主要实现了退出功能 frame.addWindowListener(new MyWindowListener2()); // 加一个标签 label = new Label("This is my Window"); frame.add(label, BorderLayout.NORTH); // 加一个按钮 button = new Button("MyButton"); frame.add(button, BorderLayout.WEST); // 设置按钮事件监听器,按钮按下时会向控制台输出信息 button.addActionListener(new MyButtonListener2()); // 加一个文本编辑框 textField = new TextField(40); frame.add(textField, BorderLayout.SOUTH); // 加上鼠标动作监听器,因为类本身实现了这两个接口,所以参数是this frame.addMouseListener(this); frame.addMouseMotionListener(this); // 可以添加多个监听器,所以还可以定义其他的,如MyMouseListener类,然后加上 // 设置刚好能容纳这些控件的尺寸 frame.pack(); // 设置为可见 frame.setVisible(true); } public static void main(String[] args) { MyWindow window = new MyWindow(); window.go(); } @Override public void mouseMoved(MouseEvent e) { String str = "x = " + e.getX() + ", y = " + e.getY(); this.textField.setText(str); System.out.println(str); } @Override public void mouseExited(MouseEvent e) { this.textField.setText("the mouse has exited."); } } class MyButtonListener2 implements ActionListener { // 因为ActionListener只有一个方法,所以没有适配器 @SuppressWarnings("deprecation") @Override public void actionPerformed(ActionEvent e) { // 输出信息 System.out.println("The Button is pressed!"); // 输出时间戳 Long time = e.getWhen(); System.out.println("timestamp: " + time); // 日期时间 Date date = new Date(time); System.out.println(date.toLocaleString()); } } class MyWindowListener2 extends WindowAdapter { @Override public void windowClosing(WindowEvent e) { System.out.println("windowClosing"); // 退出 System.exit(0); } }
参考资料
张龙老师Java SE教学视频。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了