熟悉MS-Windows和X Windows事件驱动设计模式的开发人员,通常是把一个方法的指针传递给事件源,当某一事件发生时来调用这个方法(也称为“回调”)。Java的面向对象的模型目前不支持方法指针,似乎不能使用这种方便的机制。
     Java支持interface,通过interface可以实现相同的回调。其诀窍就在于定义一个简单的interface,申明一个被希望回调的方法。
     例如,假定当某一事件发生时会得到通知,我们可以定义一个interface:
          public interface InterestingEvent {
              // 这只是一个普通的方法,可以接收参数、也可以返回值
              public void interestingEvent();
          }
这样我们就有了任何一个实现了这个接口类对象的手柄grip。

当一事件发生时,需要通知实现InterestingEvent 接口的对象,并调用interestingEvent() 方法。
class EventNotifier {
    private InterestingEvent ie;
    private boolean somethingHappened;
    public EventNotifier(InterestingEvent event) {
        ie = event;
        somethingHappened = false;
    }
    public void doWork() {
        if (somethingHappened) {
            // 事件发生时,通过调用接口的这个方法来通知
            ie.interestingEvent();
        }       
    }
}
在这个例子中,用somethingHappened 来标志事件是否发生。

希望接收事件通知的类必须要实现InterestingEvent 接口,而且要把自己的引用传递给事件的通知者。
public class CallMe implements InterestingEvent {
    private EventNotifier en;
    public CallMe() {
        // 新建一个事件通知者对象,并把自己传递给它
        en = new EventNotifier(this);
    }
    // 实现事件发生时,实际处理事件的方法
    public void interestingEvent() {
        // 这个事件发生了,进行处理
    }
}
以上是通过一个非常简单的例子来说明Java中的回调的实现。

当然,也可以在事件管理或事件通知者类中,通过注册的方式来注册多个对此事件感兴趣的对象。
1. 定义一个接口InterestingEvent ,回调方法nterestingEvent(String event) 简单接收一个String 参数。           
     interface InterestingEvent {
         public void interestingEvent(String event);
     }
2. 实现InterestingEvent接口,事件处理类
     class CallMe implements InterestingEvent {
         private String name;
         public CallMe(String name){
         this.name = name;
         }   
         public void interestingEvent(String event) {
             System.out.println(name + ":[" +event  + "] happened");
         }
     }

3. 事件管理者,或事件通知者
     class EventNotifier {
         private List<CallMe> callMes = new ArrayList<CallMe>();
         public void regist(CallMe callMe){
             callMes.add(callMe);
         }
   
         public void doWork(){
             for(CallMe callMe: callMes) {
                 callMe.interestingEvent("sample event");
             }
         }   
     }

4. 测试
     public class CallMeTest {
         public static void main(String[] args) {
             EventNotifier ren = new EventNotifier();
             CallMe a = new CallMe("CallMe A");
             CallMe b = new CallMe("CallMe B");

             // regiest
             ren.regist(a);
             ren.regist(b);
       
             // test
             ren.doWork();       
         }
     }

16)JAVA实现回调(Android,Swing中各类listener的实现)的更多相关文章

  1. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  2. Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法

    在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...

  3. Java自学-图形界面 Swing中的线程

    Swing中的线程 步骤 1 : 三种线程 在Swing程序的开发中,需要建立3种线程的概念 初始化线程 初始化线程用于创建各种容器,组件并显示他们,一旦创建并显示,初始化线程的任务就结束了. 事件调 ...

  4. 初探Java设计模式4:JDK中的设计模式

    JDK中设计模式 本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图.首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助.一.设计模式是什么(1)反复出现 ...

  5. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  6. Swing杂记——Swing中引入Android的NinePatch技术,让Swing拥有Android的外观定制能力

    [摘要] 本文诣在展示如何在Swing中引入 NinePatch技术(早期有文章里中文译作九格图,暂且这么叫吧^_^,但此术非传统移动手机上的功能布局——九格图哦). [准备篇] Q:何为 NineP ...

  7. 浅析android系统设计中的回调思想

    一.为何写作本文  在慢慢深入接触android开发的过程中,我越来越发现android中(至少应用曾的开发)用到了很多回调的思想.比如activity的生命周期,fragment的生命周期,皆是回调 ...

  8. Android JNI中C和JAVA代码之间的互相调用

    关于Android studio中使用NDK/JNI环境和入门:http://blog.csdn.net/quan648997767/article/details/64923143 1. C代码回调 ...

  9. ZT ANDROID jni 中的事件回调机制JNIenv的使用 2012-09-10 12:53:01

    ANDROID jni 中的事件回调机制JNIenv的使用 2012-09-10 12:53:01 分类: 嵌入式 android framework 里java调用native,使用JNI机制,ja ...

随机推荐

  1. ms sqlserver 系列之如何查看数据链接数

    [转]如何查看SQL SERVER数据库当前连接数 1.通过管理工具开始->管理工具->性能(或者是运行里面输入mmc)然后通过添加计数器添加 SQL 的常用统计然后在下面列出的项目里面选 ...

  2. JAVA设计模式之依赖倒转原则

    3.1 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,简称DIP)这个名字看着有点别扭,“依赖”还“倒置”,这到底是什么意思?依赖倒置原则的原始定义是 ...

  3. VS2010 和VS2012 的程序在XP上运行的方法

    问题表象: VS2012编译的程序不能再XP下运行 解决办法: 1.工程设置的方法 在vs2012里,右键 属性->配置属性-常规->平台工具集->选个VS2008什么的就ok了~ ...

  4. 浅析人脸检测之Haar分类器方法

    一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发 ...

  5. 如何设置修改WPS批注上的用户信息名称

    http://jingyan.baidu.com/article/6b18230953cec7ba59e1596b.html 点击左上角的“WPS文字”:   选择“选项”:   点击“用户信息”: ...

  6. LAMP+LNMP视频教程

    你是否在LAMP或是LNMP源码编译的道路上走过弯路,失败过或者目前还没有顺利安装过呢?另外网上有网上有很多LAMP/LNMP的一键安装脚本,如果拿过来直接用还是要改脚本.本教程的内容就能帮助你解决手 ...

  7. sql server安装程序无法验证服务账户是什么原因

    为了帮助网友解决“sql server安装程序无法验证服务”相关的问题,中国学网通过互联网对“sql server安装程序无法验证服务”相关的解决方案进行了整理,用户详细问题包括:能是尚未向所有要安装 ...

  8. 网络设备模拟器 GNS3

    https://www.gns3.com/support/docs/linux-installation sudo dpkg --add-architecture i386 sudo add-apt- ...

  9. boost: tcp client sample

    #include <boost/asio.hpp> #include <iostream> using namespace std; using namespace boost ...

  10. 智能手机取证利器再进化-UFED Cloud Analyzer

    智能手机在现代人生活中,和钱包,钥匙一样,成了不可或缺的生活必需品,举凡食衣住行育乐都需要携带随身使用,因此,智能手机里所存放的,就是一个人的生活缩影,只是人们多半不自知智能手机竟是如此贴心的为你/妳 ...