1. 上一讲内容我们讲到多监听者,复习一下这些内容
1) 多监听者可以使一个程序的不相关部分执行同样的动作
2) 事件发生时,所有被注册的监听者的处理器都会被调用
2. 事件Adapters(适配器)
1) 你定义的Listener可以继承Adapter类,而且只需重写你所需要的方法
2) 为了方便起见,Java语言提供了Adapters类,用来实现含有多个方法的类。这些Adapters类中的方法是空的。
3) 你可以继承Adapters类,而且只需重写你所需要的方法
为简化编程,JDK针对大多数事件监听器接口定义了相应的实现类,我们称之为事件适配器(Adapter)类; 在适配器类中,实现了相应监听器接口所有方法,但不做任何事情,只要继承适配器类,就等于实现了相应的监听器接口; 如果要对某类事件的某种情况进行处理,只要覆盖相应的方法就可以,其他的方法再也不用“简单实现”了; [注意]如果想用作事件监听器的类已经继承了别的类,就不能再继承适配器类了,只能去实现事件监听器接口了
它的写法如下所示:
针对上一讲程序 TwoListener.java 如下:
图81-1:适配器的写法
1). 针对上一讲的程序 TwoListener.java中,我们去实现了MouseMotionListener接口的时候,根据Java语法必须将此接口的方法全部实现出来,而我们真正重写的就是两个方法,其他的好几个方法我们都没有真正去实现,也就是空实现了。其实这样的状况出现对整体代码阅读性来说是比较不好的,因此在这边引入了适配器的概念,通过适配器我们可以更好的整理我们的代码,适配器没有添加额外的功能,只是方便我们更好的阅读代码。
2). 大部分的监听器都有自己的适配器[接口ActionListener就是没有实现适配器的类,因为它就一个方法
actionPerformed()
,能实现这个类,肯定就是要使用这个方法,所以不用多此一举了],查看JDK Doc文档MouseMotionListener接口,可以发现其实现适配器类MouseAdapter,所以这个适配器实现了接口的所有方法,同时一个适配器也可以实现多个接口,并且实现了全部接口的方法。3). 程序demo如下:
package com.ahuier.awt; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.Label; import java.awt.TextField; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class TwoListenerAdapter { private Frame frame; private TextField textField; public void go() { frame = new Frame("Two Listener Example"); frame.add(new Label("click"), BorderLayout.NORTH); // 添加一个 Label:标签 textField = new TextField(30); // 表示文本框的长度为30 frame.add(textField, BorderLayout.SOUTH); frame.addMouseListener(new MyAdapter()); frame.setSize(300, 200); frame.setVisible(true); } public static void main(String[] args) { TwoListenerAdapter two = new TwoListenerAdapter(); two.go(); } } class MyAdapter extends MouseAdapter { @Override public void mouseEntered(MouseEvent e) { String str = "The mouse has entered the Frame"; System.out.println(str); } @Override public void mouseExited(MouseEvent e) { String str = "The mouse has exited the Frame"; System.out.println(str); } }编译执行结果就不贴出来了自己去编译。
[说明]:查看MouseAdapter源代码
public abstract class MouseAdapter implements MouseListener, MouseWheelListener, MouseMotionListener它是一个抽象类,类里面的方法全都是空的,也就是让继承这个类的类自己去实现这些方法,这里就不粘贴出来了,自己查看源代码。
可以发现它实现了Mouse的各种Listener,同时它里面定义的
3. 由于Eclipse一般没有图形化的界面设计,下载NetBeans,可以了解一下它的图形界面设计的使用方法。
4. 作业:实现一个简单的计算器。要考虑到用户的输入:Input is evil.
1). 用户输入可以支持键盘输入 [JDK Doc文档:keyAdapter 、getKeyChar()、getKeyCode() 等 ]
2). 针对异常的处理,比如说9/0是要抛出异常的,这点需要注意
3). 试着用Swing界面设计