美文网首页
Java事件处理和内部类

Java事件处理和内部类

作者: 0843d07b95d5 | 来源:发表于2018-03-16 15:57 被阅读0次

    事件处理过程

    事件处理(网络上找的图片)

    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事件处理和内部类

          本文链接:https://www.haomeiwen.com/subject/ltllqftx.html