事件处理过程
事件处理(网络上找的图片)1.实现某种监听器接口的监听器类并将该类的对象添加到事件源中
2.外部动作产生事件
3.事件源产生事件对象(所谓事件源就是产生事件对象的源,比如:按钮)
4.事件监听对象接收事件对象激活事件处理器并处理
事件处理基础知识
1.事件源(event source)
事件源是一个能够注册监听器对象并发送事件对象的对象。例如按钮或者滚动条就是事件源。
2.事件
事件一般是用户在界面上的一个操作,当一个事件发生时,该事件用一个事件对象来表示,事件对象有对应的事件类。
3.事件类型和事件对象
不同的事件类描述不同类型的用户动作,不同的事件源可以产生不同类别的事件。例如,按钮可以发送ActionEvent对象,而窗口可以发送WindowEvent对象。在Java中,所有的事件对象都最终派生于java.util.EventObject类。
4.事件监听器(event listener)和事件监听适配器(Adapter)
监听器对象是一个实现了特定监听器接口(listener interface)的类的实例。事件监听器类(监听器对象所属的类)必须实现事件监听器接口或继承事件监听器适配器类。事件监听器接口定义了处理事件必须实现的方法。适配器(Adapter)是跟监听器一一对应的类。它实现了对应监听器中的所有方法,但都是空方法。注意:适配器是一个抽象类(abstract class)而该类中的所有方法已经被实现(虽然是空的)所以在继承适配器只需要重写需要的方法,而不用实现每个方法。因此减少编程的工作量。
5.事件监听处理器
处理事件的方法被称为事件处理器,即事件监听器接口定义,并在事件监听器类中实现的方法。
6.注册事件监听器
为了能够让事件监听器检查某个组件(事件源)是否发生了某些事件,并且在发生时激活事件处理器进行相应的处理,必须在事件源上注册事件监听器。这是通过使用事件源组件的以下方法来完成的:addXxxListener(事件监听器对象)Xxx对应相应的事件类。
5.再论事件和监听器
每一类事件有一个相应的事件监听器接口,该接口定义了接收和处理事件的一种以上的抽象方法。实现该接口的类,就是监听器类。其对象可作为监听器对象向相应的组件注册。实现该接口的抽象类且方法为空的类为适配器类。适配器(Adapter)必须被继承,并且根据需要重写处理事件的方法。
事件的类名通常为:XxxEvent
对应的事件监听器接口名通常为:XxxListener
对应的事件监听适配器名通常为: XxxAdapter
例子:
import java.awt.*;
import java.awt.event.*;
public class TestActionEvent {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame {
MyFrame(){
setLayout(null);
setBounds(300, 300, 400, 300);
Button btn = new Button("click");
btn.setSize(200, 90);
add(btn);//添加按钮
Monitor mon = new Monitor();//定义监听器对象
btn.addActionListener(mon);//向button中注册监听器
addWindowListener(new WAdapter());//添加窗口监听器
pack();
setVisible(true);
}
}
class Monitor implements ActionListener {// 事件监听器类继承事件监听器接口
public void actionPerformed(ActionEvent e){//事件处理器方法
Button btn = (Button)e.getSource();
btn.setLabel("button事件处理");
}
}
class WAdapter extends WindowAdapter {//窗体适配器继承适配器抽象类
public void windowClosing(WindowEvent e) {//事件处理
MyFrame my = (MyFrame)e.getSource();
my.setVisible(false);
System.exit(0);
}
}
内部类
从名字上可以知道内部类就是在类里面声明类
我们将按钮的监听器类声明在了MyFrame类里面,MyFrame类被称为包装类
例子:
import java.awt.*;
import java.awt.event.*;
public class TestActionEvent {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame {
Button btn = new Button("click");
MyFrame(){
setLayout(null);
setBounds(300, 300, 400, 300);
this.btn.setSize(100,90);
add(this.btn);//添加按钮
Monitor mon = new Monitor();//定义监听器对象
this.btn.addActionListener(mon);//向button中注册监听器
addWindowListener(new WAdapter());//添加窗口监听器
pack();
setVisible(true);
}
private class Monitor implements ActionListener {// 事件监听器类继承事件监听器接口
public void actionPerformed(ActionEvent e){//事件处理器方法
//Button btn = (Button)e.getSource();
btn.setLabel("button事件处理");
}
}
}
/*
class Monitor implements ActionListener {// 事件监听器类继承事件监听器接口
public void actionPerformed(ActionEvent e){//事件处理器方法
Button btn = (Button)e.getSource();
btn.setLabel("button事件处理");
}
}
*/
class WAdapter extends WindowAdapter {//窗体适配器继承适配器抽象类
public void windowClosing(WindowEvent e) {//事件处理
MyFrame my = (MyFrame)e.getSource();
my.setVisible(false);
System.exit(0);
}
}
内部类的特点:
1.可以方便的访问包装类的成员
2.可以清楚的组织逻辑,防止不应该访问内部类的类访问。
对于该Monitor类的事件处理器可能只适用于该button的事件处理,对于其他类的button可能不适用。
网友评论