关于事件监听机制的总结(Listener和Adapter)
记得以前看过事件监听机制背后也是有一种设计模式的.(设计模式的名字记不清了,只记得背后实现的数据结构是数组.)
附上事件监听机制的分析图:

一个事件源可以承载多个事件(只要这个事件源支持这个事件就可以,男人就不支持生孩子的事件) 事件和监听器有对应关系的.
下面用awt中的标准图形化界面分析:

接口WindowListener 中有一个实现类WindowAdapter类.适配器类.
EventListener.java 下面是所有超级接口EventListener.java的源代码 其实就是一个空接口.
package java.util; /**
* A tagging interface that all event listener interfaces must extend.
* @since JDK1.1
*/
public interface EventListener {
}
WindowListener.java 这个接口的源代码 定义了一些抽象方法
public interface WindowListener extends EventListener {
/**
* Invoked the first time a window is made visible.
*/
public void windowOpened(WindowEvent e);
public void windowClosing(WindowEvent e);
public void windowClosed(WindowEvent e);
public void windowIconified(WindowEvent e);
public void windowDeiconified(WindowEvent e);
public void windowActivated(WindowEvent e);
public void windowDeactivated(WindowEvent e);
}
WindowAdapter.java这个实现类的源代码: WindowAdapter是一个抽象类.但是这个抽象类里面却没有抽象方法!!!!!!!
所有的方法都是空实现!!!空方法!!!
public abstract class WindowAdapter
implements WindowListener, WindowStateListener, WindowFocusListener
{
/**
* Invoked when a window has been opened.
*/
public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowStateChanged(WindowEvent e) {} public void windowGainedFocus(WindowEvent e) {} /**
* Invoked when the Window is no longer the focused Window, which means
* that keyboard events will no longer be delivered to the Window or any of
* its subcomponents.
*
* @since 1.4
*/
public void windowLostFocus(WindowEvent e) {}
}
窗口事件的抽象适配器类(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
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; public class FrameDemo {
public static void main(String[] args) { Frame f = new Frame("my frame");
f.setBounds(400, 200, 500, 400);
f.setLayout(new FlowLayout());//设置流式布局 Button but = new Button("一个按钮");
f.add(but);//将按钮添加到窗体中。 f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//System.out.println("closing......."+e);
System.exit(0);
}
});
//在按钮上加上一个监听。 点击按钮"一个按钮"就关闭
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println("button run .....");
System.exit(0);
}
});
f.setVisible(true);
System.out.println("over");
}
}

点击"右上角的×"和"一个按钮"都是关闭的效果.
关于事件监听机制的总结(Listener和Adapter)的更多相关文章
- java事件监听机制2
今天早上的两点收获: 1.addActionListener(其中的setActionCommand函数就是要对对象进行唯一性的标记,便于消息传来后进行处理.理论上actionlistener可以全部 ...
- JAVA事件监听机制的实现
今天学习了java的事件编程机制,略有体会,先在此记下心得. 第一,首先明确几个概念. 事件源:一个产生或者触发事件的对象.事件:承载事件源状态改变时的信息对象.事件监听器接口:实际上就是一个类,该类 ...
- .NET事件监听机制的局限与扩展
.NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeB ...
- JAVA事件监听机制学习
//事件监听机制 import java.awt.*; import java.awt.event.*; public class TestEvent { public static void mai ...
- java Gui编程 事件监听机制
1. GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式: 1. 命令交互方式 图书管理系统 ...
- 简单剖析Node中的事件监听机制(一)
使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用 ...
- Spring ApplicationContext(八)事件监听机制
Spring ApplicationContext(八)事件监听机制 本节则重点关注的是 Spring 的事件监听机制,主要是第 8 步:多播器注册:第 10 步:事件注册. public void ...
- 创建图形用户界面GUI和事件监听机制的简单实现(java)
创建图形化界面 1.创建Frame窗体 2.对窗体进行基本设置 比如:大小.位置.布局 3.定义组件 4.将组建通过窗体添加到窗体中 5.让窗体显示,通过setVisib ...
- Java 中的事件监听机制
看项目代码时遇到了好多事件监听机制相关的代码.现学习一下: java事件机制包含三个部分:事件.事件监听器.事件源. 1.事件:继承自java.util.EventObject类,开发人员自己定义. ...
随机推荐
- 多线程与网络之cookies
1. 网络请求中的cookie 1.1 删除cooki NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCook ...
- ThoughtWorks(中国)程序员读书雷达 —— 书籍下载整理
ThoughtWorks(中国)程序员读书雷达 http://agiledon.github.io/blog/2013/04/17/thoughtworks-developer-reading-rad ...
- 打印出从1到最大的n位十进制数
首先这一题会溢出,要考虑的大数问题.所以不能用简单的是int类型数来表示(32位无符号int 范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回 ...
- bzoj 1411 [ZJOI2009]硬币游戏
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1411 [题意] N个硬币放在一个有2*N个位置的圆桌上,求T次操作后的情况.对于一个操 ...
- Android编译过程详解(一)
Android编译过程详解(一) 注:本文转载自Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359 ...
- light oj 1078 - Integer Divisibility
1078 - Integer Divisibility PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...
- [iOS基础控件 - 5.3] 电台APP可滚动主界面(UIScrollView制作)
A.功能 1.上下可滚动的电台 2 x n 的图标集 2.顶部半透明标题 3.底部半透明功能按钮 B.实现思路 1.设置图标.启动画面 2.拖入UIScrollView,设置背景色 ( ...
- Winform- DotNetBar for Windows Forms的安装的添加
Winform界面不好看,偶尔在网上看到winform的界面美化,对比了一下选择了DotNetBar for Windows Forms 1.破解版网上很多,提供一个参考的下载地址http://dx. ...
- C# 条形码 生成函数 (Code 128 标准
C# 条形码 生成函数 (Code 128 标准参考:GB/T 18347-2001) 最近在做单据打印,发现客户要求用到条形码,在网上找了,发现只有一些条形码的标准,但打出来发现根本不能扫,还要加某 ...
- android 五子棋开发
两天完成基本功能,再对其进行细节bug优化,本小白的思路. 思路: 1.用canvas绘制棋盘:得到手机的分辨率.棋盘大小为19*19.将手机宽屏分为21份,取中间19份为棋盘.上下空白位置为按钮功能 ...