• java事件机制


    java事件机制(续)
    ——自定义事件
     
    开始之前首先问个问题:您熟悉java.util.EventObject 和java.util.EventListener两个类以及他们已有的子类吗?
    如果你已经能够熟练使用jdk为我们提供的事件监听器,并且很熟悉MouseEvent, KeyEvent, WindowEvent等等这些jdk为我们准备好的事件,那么想必你对java的事件机制已经有所理解。但是也许你还是觉得虽然用起来没什么问题,但是原理还是有些糊涂,那么下面我们再进一步自己实现这些事件和监听器,我们把这个取名为自定义事件。
     
    其实自定义事件在java中很有用处,我们有的时候想让自己的程序产生一个事件,但有不希望(或者不可能)用鼠标,键盘之类的输入设备进行操作,比如你写一个应用程序,在这个程序中一旦收到邮件就对邮件进行相关处理,对于“收到邮件”这个事件,jdk中就没有定义。对于这样的事件,以及对于这样的事件的监听器,我们只能自己动手完成了。
     
    那么下面就以实例开始我们这个“创新”的过程:首先,我们要明确jdk中需要的资源:类EventObject作为父类用来生成我们自己的事件类,接口EventListener用来实现我们自己的监听器;剩下的事情就是如何注册这些事件以及测试他们了。
    让我们一步一步实现它吧:
    (1)       通过DemoEvent.java文件创建DemoEvent类,这个类继承EventObject。这个类的构造函数的参数传递了产生这个事件的事件源(比如各种控件),方法getSource用来获得这个事件源的引用。
    DemoEvent.java
    package demo.listener;
     
    import java.util.EventObject;
     
    public class DemoEvent extends EventObject
    {
            Object obj;
            public DemoEvent(Object source)
            {
                   super(source);
                   obj = source;
            }
            public Object getSource()
            {
                   return obj;
            }
            public void say()
            {
                   System.out.println("This is say method...");
            }
    }
     
    (2)       定义新的事件监听接口,该接口继承自EventListener;该接口包含对DemeEvent事件的处理程序:
    DemoListener.java
    package demo.listener;
     
    import java.util.EventListener;
     
    public interface DemoListener extends EventListener
    {
           public void demoEvent(DemoEvent dm);
    }
     
    通过上面的接口我们再定义事件监听类,这些类具体实现了监听功能和事件处理功能。回想一下上文中那四种实现方式,我们这里不正是使用了其中的第三种——外部类写法的方式吗?
    Listener1.java
    package demo.listener;
     
    public class Listener1 implements DemoListener
    {
           public void demoEvent(DemoEvent de)
           {
                  System.out.println("Inside listener1...");
           }
    }


    Listener2.java
    package demo.listener;
     
    public class Listener2 implements DemoListener
    {
           public void demoEvent(DemoEvent de)
           {
                  System.out.println("Inside listener2...");
           }
    }

    Listener3.java
    package demo.listener;
     
    public class Listener3 implements DemoListener
    {
           public void demoEvent(DemoEvent de)
           {
                  System.out.println("Inside listener3...");
           }
    }
     
    (3)       通过DemeSource..ava文件创造一个事件源类,它用一个java.utile.Vector对象来存储所有的事件监听器对象,存储方式是通过addListener(..)这样的方法。notifyDemeEvent(..)是触发事件的方法,用来通知系统:事件发生了,你调用相应的处理函数(回调函数)吧。
    DemoSource.java
     
    package demo.listener;
    import java.util.*;
     
    public class DemoSource
    {
           private Vector repository = new Vector();
           DemoListener dl;
           public DemoSource()
           {
     
           }
           public void addDemoListener(DemoListener dl)
           {
                  repository.addElement(dl);
           }
           public void notifyDemoEvent()
           {
                  Enumeration enum = repository.elements();
                  while(enum.hasMoreElements())
                  {
                        dl = (DemoListener)enum.nextElement();
                        dl.demoEvent(new DemoEvent(this));
                  }
           }
    }
     
     
                 
    (4)       好了,最后写一个测试程序测试一下我们自定义的事件吧,这段程序应该不难理解吧:)
    TestDemo.java
     
    package demo.listener;
     
    public class TestDemo
    {
           DemoSource ds;
     
           public TestDemo()
           {
                  try{
                        ds = new DemoSource();
                        Listener1 l1 = new Listener1();
                        Listener2 l2 = new Listener2();
                        Listener3 l3 = new Listener3();
     
                        ds.addDemoListener(l1);
                        ds.addDemoListener(l2);
                        ds.addDemoListener(l3);
     
                        ds.notifyDemoEvent();
     
                  }catch(Exception ex)
                  {ex.printStackTrace();}
           }
     
           public static void main(String args[])
           {
                  new TestDemo();
           }
    }
  • 相关阅读:
    Two strings CodeForces
    Dasha and Photos CodeForces
    Largest Beautiful Number CodeForces
    Timetable CodeForces
    Financiers Game CodeForces
    AC日记——整理药名 openjudge 1.7 15
    AC日记——大小写字母互换 openjudge 1.7 14
    AC日记——将字符串中的小写字母换成大写字母 openjudge 1.7 13
    AC日记——加密的病历单 openjudge 1.7 12
    AC日记——潜伏着 openjudge 1.7 11
  • 原文地址:https://www.cnblogs.com/im/p/1298233.html
Copyright © 2020-2023  润新知