JAVA事件响应机制

1,先自定义一个事件

public class MyEvent extends java.util.EventObject{

public MyEvent(Object source)

{

super(source);

}

}

2,再自定义一个监听器

public class MyListener implements java.util.EventListener{

//这里是当事件发生后的响应过程

public void EventActivated(MyEvent me)

{

System.out.println("事件已经被触发");

}

}

3,以下这个类为触发事件的事件源

public class MyObject {

private Vector vectorListeners=new Vector();

public synchronized void addMyListener(MyListener ml)

{

vectorListeners.addElement(ml);

}

public synchronized void removeMyListener(MyListener ml)

{

vectorListeners.removeElement(ml);

}

protected void activateMyEvent()

{

Vector tempVector=null;

MyEvent e=new MyEvent(this);

synchronized(this)

{

tempVector=(Vector)vectorListeners.clone();

for(int i=0;i

{

MyListener ml=(MyListener)tempVector.elementAt(i);

ml.EventActivated(e);

}

}

}

//定义一个公用方法用于触发事件

public void test()

{

activateMyEvent();

}

}

4,测试类

public class Test {

public static void main(String[] args)

{

MyObject mo=new MyObject();

//注册该事件

mo.addMyListener(new MyListener());

//触发该事件

mo.test();

}

}

观察者模式-Java自定义事件

import

java.util.EventObject;

/**

* Title: 事件处理类,继承了事件基类

* Description:

* Copyright: Copyright (c) 2005 Company:

* cuijiang

*

*

@author not attributable

*

@version 1.0

*/

public

class

DemoEventextends

EventObject {

private Object obj;

private

String sName;

public

DemoEvent(Object source, String sName) {

super(source);

obj = source;

this.sName = sName;

}

public

Object getSource() {

return obj;

}

public

void

say() {

System.out.println("这个是 say 方法...");

}

public

String getName() {

return sName;

}

}

package

com.te.event.other;

import

java.util.EventListener;

/**

* Title: 监听器接口

* Description:

* Copyright: Copyright (c) 2005

* Company: cuijiang

*

@author not attributable

*

@version 1.0

*/

public

interface

DemoListenerextends

EventListener{

public

void demoEvent(DemoEvent dm);

}

package

com.te.event.other;

import

java.util.

*

;

/**

* Title: 使用事件的类

* Description: 该类实现了监听器的添加和监听器方法的执行,并且实现了由于属性的改变而执行事件

* Description: 在添加、删除、执行监听器的时候都要注意同步问题

* Copyright: Copyright (c) 2005

* Company: cuijiang

*

@author not attributable

*

@version 1.0

*/

public

class

DemoSource {

private Vector repository =

new Vector();

private

DemoListener dl;

private

String sName

=

""

;

public

DemoSource() {

}

//

注册监听器,如果这里没有使用Vector而是使用ArrayList那么要注意同步问题

public

void addDemoListener(DemoListener dl) {

repository.addElement(dl);

//

这步要注意同步问题

}

//

如果这里没有使用Vector而是使用ArrayList那么要注意同步问题

public

void notifyDemoEvent(DemoEvent event) {

Enumeration enu = repository.elements();

//

这步要注意同步问题

while (enu.hasMoreElements()) {

dl = (DemoListener) enu.nextElement();

dl.demoEvent(event);

}

}

//

删除监听器,如果这里没有使用Vector而是使用ArrayList那么要注意同步问题

public

void removeDemoListener(DemoListener dl) {

repository.remove(dl);

//

这步要注意同步问题

}

/**

* 设置属性

*

@param str1 String

*/

public

void setName(String str1) {

boolean bool =

false;

if (str1 ==

null && sName !=

null)

bool =

true;

else

if (str1 !=

null && sName ==

null)

bool =

true;

else

if (!sName.equals(str1))

bool =

true;

this

.sName

=

str1;

//

如果改变则执行事件

if (bool)

notifyDemoEvent(

new DemoEvent(

this, sName));

}

public

String getName() {

return sName;

}

}

package

com.te.event.other;

import

java.lang.Thread;

/**

* Title: 测试类

* Description: 测试了由于改变属性而引起的事件发生

* Copyright: Copyright (c) 2005

* Company: cuijiang

*

@author not attributable

*

@version 1.0

*/

public

class

TestDemo

implements DemoListener {

private DemoSource ds;

public

TestDemo()

{

ds=

new DemoSource();

ds.addDemoListener(

this);

System.out.println("添加监听器完毕");

try {

Thread.sleep(3000);

//

改变属性,触发事件

ds.setName("改变属性,触发事件");

}

catch (InterruptedException ex) {

ex.printStackTrace();

}

ds.addDemoListener(

this

);

System.out.println("添加监听器完毕2");

try {

Thread.sleep(3000);

//

改变属性,触发事件

ds.setName("改变属性,触发事件2");

}

catch (InterruptedException ex) {

ex.printStackTrace();

}

ds.removeDemoListener(

this

);

System.out.println("添加监听器完毕3");

try {

Thread.sleep(3000);

//

改变属性,触发事件

ds.setName("改变属性,触发事件3");

}

catch (InterruptedException ex) {

ex.printStackTrace();

}

}

public

static

void main(String args[])

{

new

TestDemo();

}

/**

* demoEvent

*

*

@param dm DemoEvent

* @todo Implement this test.DemoListener method

*/

public

void demoEvent(DemoEvent dm) {

System.out.println("事件处理方法");

System.out.println(dm.getName());

dm.say();

}

}

java的响应机制_JAVA事件响应机制相关推荐

  1. android gridview 按钮事件处理,Android TV gridview 的按键事件响应巧变 事件分发机制...

    在gridview点击事件之后,打log看了下, 看到gridview的onclick事件响应的竟然排在onkeyup之后,这造成100~200ms的延迟啊, 后来换了在其它响应事件里面截取,但是在o ...

  2. java tcp 心跳机制_Java实现心跳机制的方法

    一.心跳机制简介 在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效.为了检测对方节点的有效性,每隔固定时间就发送一个固定信息给对方,对方回复一个固定信息 ...

  3. java spi机制_Java 双亲委派机制的破坏—SPI机制

    作者:程序猿微录 出自:TinyRecord 原文:tinyice.cn/articles/123 Java 双亲委派机制的破坏-SPI机制 在Java的类加载机制中,默认的就是双亲委派机制,这种委派 ...

  4. Android事件的响应,Android 开发事件响应之基于监听的事件响应

    Android 开发事件响应之基于监听的事件响应 本文将介绍Android 操作系统如何通过监听来实现对事件的响应. Android 开发事件响应之基于监听的事件响应 背景介绍 Android 开发事 ...

  5. Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制

    一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...

  6. java的自省机制_JAVA内省(自省)机制 ( Introspector , BeanInfo, PropertyDescriptor )

    目的和作用: 通过内省,获取和操作javaBean中的成员信息(方法,事件,属性). ------------------内省使用的核心类(接口)-------------------– Java.b ...

  7. java实现请求发送_java实现响应重定向发送post请求操作示例

    本文实例讲述了java实现响应重定向发送post请求操作.分享给大家供大家参考,具体如下: 关于重定向我们用的比较多的还是redirect:重定向,默认发送的get请求. return "r ...

  8. java 强制垃圾回收_Java垃圾回收机制

    Java垃圾回收机制 垃圾回收机制用到finalize.当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存 ...

  9. java 有哪些反射机制_Java 的反射机制你了解多少?

    不知道多少次听说过了Java反射机制的使用,比如:Spring 框架如何实例化IoC容器中的Bean,编码过程中如何动态的清理对象中的字段信息等等.工作中只是听说.看同事们编码实践,但是自己却只是概念 ...

最新文章

  1. IL,Emit之OpCodes说明(备查)
  2. HEW MAP文件使用
  3. Mac 新建unix可执行文件
  4. java.lang.Math
  5. pgadmin4 python
  6. 06.delete_by_query操作
  7. 关于谷歌云,你应该知道的一切! | 技术头条
  8. 如何将多个文件捆绑成一个可执行文件
  9. python runtime错误_Python错误:没有名为RuntimeE的模块
  10. 【日本語勉強】日本語四級文法突撃(11~20)
  11. tensorflow 安装_安装tensorflow-gpu 2.0
  12. 【Laravel】使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
  13. 文件同步工具CwRsync的使用教程
  14. mysql 数据库引擎切花_asyncio异步编程,你搞懂了吗?
  15. mysql中如何删除某个字段中的某个字符
  16. 剑指offer-二叉树(python)
  17. 前装ADAS单月搭载量创11个月以来新低,“缺芯”背后暗潮涌动
  18. 著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到: 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
  19. 甜菜碱改善肥胖和代谢,肠道菌群是关键
  20. 物联网平台行业类型划分:CMP、DMP、AEP、BAP

热门文章

  1. 阿里云科学家入选计算机顶会 HPCA 名人堂,他是什么来头?
  2. 微信 iOS 版正式支持深色模式;谷歌宣布彻底取消I/O开发者大会;Visual Studio 2019 16.5发布|极客头条...
  3. 40万亿“新基建”来了!程序员的新翻身机会终于也来了!
  4. 面对疫情,AI 能做什么?
  5. 程序员VS产品经理日常
  6. 如何使用 kubeadm 安装 Kubernetes?
  7. “对不起,我就是传说中的 10 倍工程师”
  8. 《长安十二时辰》火了!程序员版本过于真实!
  9. Oracle 痛裁程序员,阿里云坐收渔翁利?
  10. CSDN 创始人蒋涛:AI 定义的开发者时代