zoukankan      html  css  js  c++  java
  • java事件处理机制(自定义事件)

    java事件处理机制(自定义事件)

    java事件机制包括三个部分:事件、事件监听器、事件源。

    1、事件。一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息。

    也就是这个事件有哪些属性和行为,比如说门,有打开和关闭两种行为

    2、事件监听器。实现java.util.EventListener接口,注册在事件源上。 当事件源的属性或状态改变时,取得相应的监听器调用其内部的回调方法。

    比如是门的话,做具体的开门,关门,以及开灯,关灯动作

    3、事件源。事件发生的地方,由于事件源的某项属性或状态发生了改变(比如BUTTON被单击、TEXTBOX的值发生改变等等)导致某项事件发生。换句话说就是生成了相应的事件对象。

    因为事件监听器要注册在事件源上,所以事件源类中应该要有盛装监听器的容器(List,Set等等)。

    事件源对象,在这里你可以把它想象成一个控制开门关门的遥控器

    (1)通过DoorEvent.java文件创建DoorEvent类,这个类继承EventObject。

    /**
    * 定义事件对象,必须继承EventObject
    */

    复制代码
    public class DoorEvent extends EventObject {
    
        private static final long serialVersionUID = 6496098798146410884L;
    
        private String doorState = "";// 表示门的状态,有“开”和“关”两种
    
        public DoorEvent(Object source, String doorState) {
            super(source);
            this.doorState = doorState;
        }
    
        public void setDoorState(String doorState) {
            this.doorState = doorState;
        }
    
        public String getDoorState() {
            return this.doorState;
        }
    
    }
    复制代码

    (2)定义新的事件监听接口,该接口继承自EventListener;该接口包含对doorEvent事件的处理程序:

    /**
    * 定义监听接口,负责监听DoorEvent事件
    */

    public interface DoorListener extends EventListener {
         public void doorEvent(DoorEvent event);
    }

    通过上面的接口我们再定义事件监听类,这些类具体实现了监听功能和事件处理功能。

    /**
    * 该类为 门1监听接口的实现,做具体的开门,关门动作
    */

    复制代码
    public class DoorListener1 implements DoorListener {
        @Override
        public void doorEvent(DoorEvent event) {
            // TODO Auto-generated method stub
            if (event.getDoorState() != null && event.getDoorState().equals("open")) {
                System.out.println("门1打开");
            } else {
                System.out.println("门1关闭");
            }
        }
    
    }
    复制代码

    /**

    * 该类为 门2监听接口的实现,做具体的开门,关门,以及开灯,关灯动作
    */

    复制代码
    public class DoorListener2 implements DoorListener {
    
        @Override
        public void doorEvent(DoorEvent event) {
            // TODO Auto-generated method stub
            if (event.getDoorState() != null && event.getDoorState().equals("open")) {
                System.out.println("门2打开,同时打开走廊的灯");
            } else {
                System.out.println("门2关闭,同时关闭走廊的灯");
            }
        }
    
    }
    复制代码

    (3)通过DoorManager.java创造一个事件源类,它用一个Collection listeners对象来存储所有的事件监听器对象,存储方式是通过addDoorListener(..)这样的方法。notifyListeners(..)是触发事件的方法,用来通知系统:事件发生了,你调用相应的处理函数吧。

    /**
    * 事件源对象,在这里你可以把它想象成一个控制开门关门的遥控器,
    * (如果是在swing中,就类似一个button)
    */

    复制代码
    public class DoorManager {
        private Collection listeners;
    
        /**
         * 添加事件
         * 
         * @param listener
         *            DoorListener
         */
        public void addDoorListener(DoorListener listener) {
            if (listeners == null) {
                listeners = new HashSet();
            }
            listeners.add(listener);
        }
    
        /**
         * 移除事件
         * 
         * @param listener
         *            DoorListener
         */
        public void removeDoorListener(DoorListener listener) {
            if (listeners == null)
                return;
            listeners.remove(listener);
        }
    
        /**
         * 触发开门事件
         */
        protected void fireWorkspaceOpened() {
            if (listeners == null)
                return;
            DoorEvent event = new DoorEvent(this, "open");
            notifyListeners(event);
        }
    
        /**
         * 触发关门事件
         */
        protected void fireWorkspaceClosed() {
            if (listeners == null)
                return;
            DoorEvent event = new DoorEvent(this, "close");
            notifyListeners(event);
        }
    
        /**
         * 通知所有的DoorListener
         */
        private void notifyListeners(DoorEvent event) {
            Iterator iter = listeners.iterator();
            while (iter.hasNext()) {
                DoorListener listener = (DoorListener) iter.next();
                listener.doorEvent(event);
            }
        }
    }
    复制代码

    (4)好了,最后写一个测试程序测试一下我们自定义的事件吧,这段程序应该不难理解吧:)

    /**
    * 主程序,就想象成要开门的哪个人
    */

    复制代码
    public class DoorMain {
        public static void main(String[] args) {
            DoorManager manager = new DoorManager();
            manager.addDoorListener(new DoorListener1());// 给门1增加监听器
            manager.addDoorListener(new DoorListener2());// 给门2增加监听器
            // 开门
            manager.fireWorkspaceOpened();
            System.out.println("我已经进来了");
            // 关门
            manager.fireWorkspaceClosed();
        }
    }
    复制代码

    运行DoorMain

    门1打开 
    门2打开,同时打开走廊的灯
    我已经进来了
    门1关闭
    门2关闭,同时关闭走廊的灯

  • 相关阅读:
    [转]Ubuntu设置Redhat风格的SHELL提示符PS1属性
    [转]Ubuntu Adsl 上网
    [转]Bash中的PS1详解
    Verilog 关于用task仿真应注意的一个问题
    [转]提高编程技能最有效的方法
    [转]ubuntu 终端常用命令
    [转]VMware Workstation 7.1 正式版 For Linux
    [转]Vim基本操作
    [转]Ubuntu Linux下设置IP的配置命令
    xilinxftp.newlocation
  • 原文地址:https://www.cnblogs.com/handsome1013/p/7094924.html
Copyright © 2011-2022 走看看