Java事件处理和内部类

事件处理过程

Java事件处理和内部类_第1张图片
事件处理(网络上找的图片)

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可能不适用。

你可能感兴趣的:(Java事件处理和内部类)