关于事件监听机制的总结(Listener和Adapter)

记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.)

附上事件监听机制的分析图:

一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以,男人就不支持生孩子的事件)  事件和监听器有对应关系的.

下面用awt中的标准图形化界面分析:

接口WindowListener 中有一个实现类WindowAdapter类.适配器类.

EventListener.java 下面是所有超级接口EventListener.java的源代码   其实就是一个空接口.

1 package java.util;
2
3 /**
4  * A tagging interface that all event listener interfaces must extend.
5  * @since JDK1.1
6  */
7 public interface EventListener {
8 }

WindowListener.java 这个接口的源代码  定义了一些抽象方法

 1 public interface WindowListener extends EventListener {
 2     /**
 3      * Invoked the first time a window is made visible.
 4      */
 5     public void windowOpened(WindowEvent e);
 6
 7     public void windowClosing(WindowEvent e);
 8
 9     public void windowClosed(WindowEvent e);
10
11     public void windowIconified(WindowEvent e);
12
13     public void windowDeiconified(WindowEvent e);
14
15     public void windowActivated(WindowEvent e);
16
17     public void windowDeactivated(WindowEvent e);
18 }

WindowAdapter.java这个实现类的源代码: WindowAdapter是一个抽象类.但是这个抽象类里面却没有抽象方法!!!!!!!

所有的方法都是空实现!!!空方法!!!

 1 public abstract class WindowAdapter
 2     implements WindowListener, WindowStateListener, WindowFocusListener
 3 {
 4     /**
 5      * Invoked when a window has been opened.
 6      */
 7     public void windowOpened(WindowEvent e) {}
 8
 9     public void windowClosing(WindowEvent e) {}
10
11     public void windowClosed(WindowEvent e) {}
12
13     public void windowIconified(WindowEvent e) {}
14
15     public void windowDeiconified(WindowEvent e) {}
16
17     public void windowActivated(WindowEvent e) {}
18
19     public void windowDeactivated(WindowEvent e) {}
20
21     public void windowStateChanged(WindowEvent e) {}
22
23     public void windowGainedFocus(WindowEvent e) {}
24
25     /**
26      * Invoked when the Window is no longer the focused Window, which means
27      * that keyboard events will no longer be delivered to the Window or any of
28      * its subcomponents.
29      *
30      * @since 1.4
31      */
32     public void windowLostFocus(WindowEvent e) {}
33 }

窗口事件的抽象适配器类(WindowAdapter).此类中的方法为空.此类存在的目的是方便创建监听器对象.

如果实现WindowListener 就要覆盖其中的所有抽象方法,但是继承WindowAdapter就不需要了,JDK为你定义好了这样的一个适配器类,

实现了所有WindowListener接口中的抽象方法.所以只需继承WindowAdapter类就可以了.需要什么方法就覆盖其中的方法.

EventListener是接口,WindowListener 也是接口,WindowAdapter是一个抽象类.

EventListener接口是一个空接口,WindowListener接口定义了一些公用的抽象方法,WindowAdapter是一个抽象类,但是里面没有任何的抽象方法.

要深入理解抽象类和接口的区别.

抽象类可以不含有抽象方法的!!!

因为这样有两个好处.

1.不让该类创建对象.

2.方便创建该接口的对象.

继承我这个抽象类,选择其中的一个方法去覆盖就可以了

在其中直接用匿名内部类就可以了.用哪个覆盖哪个.

给一个按钮增加一个活动监听.ActionListener

在Button类中有一个addActionListener(Listener l)  添加指定的动作侦听器,以接收发自此按钮的动作事件。

其中要传入一个ActionListener对象.看一下这个ActionListener对象

这个ActionListener对象有N多实现类,但是却不像WindowsLisntener一样有一个对应的适配器类.因为这个ActionListener接口中只有一个方法.

这就是一种原则,规则性的问题.

只要监听器中的方法超过两个一般都有一个对应的适配器,但是这个ActionListener接口中值有一个方法.

监听器中有两个或者两个以内方法的话没有对应适配器类的,创建本身就很方便.

addActionListener(ActionListener l)方法参数传递的是接口型引用,ActionListener本身方法又不多(就只有一个方法,只要覆写一个或者两个就可以了),

方法参数中用匿名内部类就可以了,这样表示看着更简洁明了.

窗体监听(WindowListener)和活动监听(ActionListener)

下面附上代码Demo

 1 import java.awt.Button;
 2 import java.awt.FlowLayout;
 3 import java.awt.Frame;
 4 import java.awt.event.ActionEvent;
 5 import java.awt.event.ActionListener;
 6 import java.awt.event.WindowAdapter;
 7 import java.awt.event.WindowEvent;
 8
 9 public class FrameDemo {
10     public static void main(String[] args) {
11
12         Frame f = new Frame("my frame");
13         f.setBounds(400, 200, 500, 400);
14         f.setLayout(new FlowLayout());//设置流式布局
15
16         Button but  = new Button("一个按钮");
17         f.add(but);//将按钮添加到窗体中。
18
19         f.addWindowListener(new WindowAdapter() {
20             @Override
21             public void windowClosing(WindowEvent e) {
22                 //System.out.println("closing......."+e);
23                 System.exit(0);
24             }
25         });
26         //在按钮上加上一个监听。  点击按钮"一个按钮"就关闭
27         but.addActionListener(new ActionListener() {
28             @Override
29             public void actionPerformed(ActionEvent e) {
30                 //System.out.println("button run .....");
31                 System.exit(0);
32             }
33         });
34         f.setVisible(true);
35         System.out.println("over");
36     }
37 }

点击"右上角的×"和"一个按钮"都是关闭的效果.

时间: 2024-10-11 16:33:44

关于事件监听机制的总结(Listener和Adapter)的相关文章

.NET事件监听机制的局限与扩展

.NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeButtonClick; // JavasomeButton.addActionListener( new ActionListener(){ public void actionPerformed(){ ... } }); 在我们的软件中就大量使用事件来对监听者与发布者解耦,但也遇到了一些局限,在这

Java 中的事件监听机制

看项目代码时遇到了好多事件监听机制相关的代码.现学习一下: java事件机制包含三个部分:事件.事件监听器.事件源. 1.事件:继承自java.util.EventObject类,开发人员自己定义. package com.shuyan.javatest.EventTest; import java.util.EventObject; public class DnsEvent extends EventObject { private String userData; private long

JAVA事件监听机制学习

//事件监听机制 import java.awt.*; import java.awt.event.*; public class TestEvent { public static void main(String[] args) { Frame f = new Frame("Test"); Button b = new Button("Press Me!"); Monitor bh = new Monitor(); //实现了某种监听器接口的类的对象 b.add

观察者模式与事件监听机制

一.观察者模式 1.1 概述 有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.它类似B/S架构模式,构建一个服务端,多个客户端显示.其实这个主题对象就像是一个信息源,当信息源的状态发送变化时,它会通知所有订阅者,使它们进行相应的处理.在百度百科中的例子是,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上. 1

简单剖析Node中的事件监听机制(一)

使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效.并且Node中的大量模块都使用了Event机制,因此可以说是整个Node中最重要的模块之一. 实例: let event = new eventEmitter(); event.on('someType',function(){ }); even

Java中的事件监听机制

鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动作发生在哪个组件上,那么该组件就是事件源对象 2.事件监听方法: addMouseListener(MouseListener ml) ;该方法主要用来捕获鼠标的释放,按下,点击,进入和离开的动作:捕获到相应的动作后,交由事件处理类(实现MouseListener接口)进行处理. addAction

4.JAVA之GUI编程事件监听机制

事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件.(如:鼠标单击事件) 监听器:将可以触发某一事件的动作(不止一个动作)都已经封装到了监听器中. 以上三者,在java中都已经定义好了,直接获取其对象来用就可以了. 我们要做的事情是,就是对产生的动作进行处理. 图解事件监听机制: 4.JAVA之GUI编程事件监听机制,布布扣,bubuko.com

GUI编程笔记05:GUI事件监听机制原理和举例说明

1.事件监听机制:       A:事件源          事件发生的地方       B:事件             就是要发生的事情       C:事件处理       就是针对发生的事情做出的处理方案       D:事件监听       就是把事件源和事件关联起来 2.举例:人受伤事件. 事件源:人(具体的对象)         Person p1 = new Person("张三");         Person p2 = new Person("李四&qu

Spring架构揭秘-事件监听机制

一.事件监听机制概述 二.事件监听机制结构 三.Spring监听机制架构 Spring的Application拥有发布事件并且注册事件监听器的能力,拥有一套完整的事件发布和监听机制.在Java中,通过java.util. EventObject来描述事件,通过java.util. EventListener来描述事件监听器,在众多的框架和组件中,建立一套事件机制通常是基于这两个接口来进行扩展. 在一个事件体系中,有以下几个重要的概念. 1.事件源:事件对象的产生者,任何一个EventObject