论坛首页 入门技术论坛

corejava辅导(10--1)

浏览 917 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-03   最后修改:2008-12-03

awt事件模型(观察者模式)(重点)

 

事件模型中,包括事件源对象事件处理者事件监听者对象),事件对象

 

 

事件源事件处理者之间建立授权关系事件源类中有一个事件处理者的对象作为属性,也可能是一个事件处理者的集合

      

         事件对象

事件源————————〉事件处理者

 

事件模型的机制事件源对象发送一个消息事件对象),事件处理者调用相应的方法处理事件

 

事件监听器接口中定义的方法,都以事件对象为参数。

 

一个事件源可以注册多个同类型的监听器,也可以注册多种多个事件监听器,一个事件监听器也可以为多个事件源服务。

 

了解一下什么是发消息:ABC三个类,分别作为事件源,事件处理者,事件对象。在A类中有一个B类的属性或者是一个内容为B类对象的集合,事件源和事件处理者之间的建立了授权关系,在B类需要实现一个自定义的接口,这个自定义的接口继承了EventListenerEventListener接口中没有定义任何方法,EventListener是一个标记接口。实现在自定义接口中定义好的用于事件处理的方法,C类要继承EventObject类。这些方法是以事件对象为参数的b(C c),在Aa(C c)方法中使用B类的对象调用B类中的b(C c)方法,并把事件对象作为参数,并在main方法中用A类的对象调用了a(c)方法,叫做A类对象给B类发送了消息。

 

例:

public class Test{

     public static void main(String[] args){

         B bt=new B()

         A at=new A(bt);

         at.a(new c());

}

}

class A{

     private B b;

     public A(){}

     public A(B b){

         this.b=b;

}

public void a(C c){

     b.b(c);

}

}

 

class B{

     public void b(C c){

         System.out.println(“this is message ”+c.c())

     }

}

 

class C{

     public void c (){

         System.out.println(“C Object”);

}

}

事件源对象间接调用了事件监听器的方法,以事件对象为实参传到事件监听器的方法中,事件源给事件监听器的方法发了一个消息(事件对象)。

 

例子如下:

import java.util.*;

//事件源类

class A{

     private String test;

     private List li=new ArrayList();

     public A(String test){

         this.test=test;

     }

     public String getTest(){return this.test;}

     public void addB(B b){

         this.li.add(b);

     }

     public void removeB(B b){

         this.li.remove(b);

     }

     public void fire(){

         C c=new C(this);

         Iterator it=li.iterator();

         while(it.hasNext()){

              B b=(B)it.next();

              b.b(c);

         }

     }   

}

//事件监听器的接口,要继承EventListener标记接口

interface Blistener extends EventListener{

     void b(C c);

}

//事件监听器,实现接口

class B implements Blistener{

     public void b(C c){

         A a=(A)c.getSource();

         System.out.println(a.getTest()+" "+c.getMessage());

     }

}

//事件对象类

class C extends EventObject{

     private String message;

     public C(Object src){

         super(src);

     }

     public void setMessage(String message){

         this.message=message;

     }

     public String getMessage(){return this.message;}

}

public class Test{

     public static void main(String[] args){

         A a1=new A("Event");

         B b1=new B();

         c1.setMessage("Test");

         a1.addB(b1);//注册监听器

         a1.fire();//发送事件

     }

}

以上代码只是事例,在引入包之后可以运行。

 

事件对象继承自EventObject类,并可以通过getSource()方法获得事件源对象,当然需要在构造事件对象时将事件源对象传入,来区分是哪个事件源发出的事件,所以要用事件对象作为参数。

 

事件源事件对象监听器接口,在java.awt包中提供了很多已经定义好的,只需要实现监听接口就好了。

 

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics