JavaBeans程序开发从入门到精通(3)

2008-02-23 07:46:31来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折



  

  /*先定义了一个鼠标移动事件对象*/

    public class MouseMovedExampleEvent

  extends java.util.EventObject {

  // 在此类中包含了与鼠标移动事件有关的状态信息

       ...

    }

    /*定义了鼠标移动事件的监听者接口*/

    interface MouseMovedExampleListener

  extends java.util.EventListener {

  /*在这个接口中定义了鼠标移动事件监听者所应支持的方法*/

  void mouseMoved(MouseMovedExampleEvent mme);

  }

  在接口中只定义方法名,方法的参数和返回值类型。 如:上面接口中的mouseMoved方法的具体实现是在下面的ArbitraryObject类中定义的。

  class ArbitraryObject implements MouseMovedExampleListener {

    public void mouseMoved(MouseMovedExampleEvent mme)

    { ... }

  }

  ArbitraryObject就是MouseMovedExampleEvent事件的监听者。

  事件监听者的注册与注销

  为了各种可能的事件监听者把自己注册入合适的事件源中,建立源与事件监听者间的事件流,事件源必须为事件监听者提供注册和注销的方法。在前面的bound属性介绍中已看到了这种使用过程,在实际中,事件监听者的注册和注销要使用标准的设计格式:

  

  public void add〈 ListenerType〉(〈 ListenerType〉 listener);

  public void remove〈 ListenerType〉(〈 ListenerType〉 listener);

  例如:

  首先定义了一个事件监听者接口:

  public interface

  ModelChangedListener extends java.util.EventListener {

   void modelChanged(EventObject e);

  }

  接着定义事件源类:

  public abstract class Model {

  private Vector listeners = new Vector(); // 定义了一个储存事件监听者的数组

  /*上面设计格式中的〈 ListenerType〉在此处即是下面的ModelChangedListener*/

  public synchronized void addModelChangedListener(ModelChangedListener mcl)

    { listeners.addElement(mcl); }//把监听者注册入listeners数组中

  public synchronized void removeModelChangedListener(ModelChangedListener mcl)

      { listeners.removeElement(mcl); //把监听者从listeners中注销

      }

    /*以上两个方法的前面均冠以synchronized,

  是因为运行在多线程环境时,

  可能同时有几个对象同时要进行注册和注销操作,

  使用synchronized来确保它们之间的同步。

  开发工具或程序员使用这两个方法建立源与监听者之间的事件流*/

  protected void notifyModelChanged() {

  /**事件源使用本方法通知监听者发生了modelChanged事件*/

      Vector l;

      EventObject e = new EventObject(this);

  /* 首先要把监听者拷贝到l数组中,

  冻结EventListeners的状态以传递事件。

  这样来确保在事件传递到所有监听者之前,

  已接收了事件的目标监听者的对应方法暂不生效。*/

      synchronized(this) {

        l = (Vector)listeners.clone();

      }

      for (int i = 0; i 〈 l.size(); i ) {

       /* 依次通知注册在监听者队列中的每个监听者发生了modelChanged事件,

       并把事件状态对象e作为参数传递给监听者队列中的每个监听者*/

  ((ModelChangedListener)l.elementAt(i)).modelChanged(e);

      }

      }

     }

  在程序中可见事件源Model类显式地调用了接口中的modelChanged方法,实际是把事件状态对象e作为参数,传递给了监听者类中的modelChanged方法。

  适配类

  适配类是Java事件模型中极其重要的一部分。在一些应用场合,事件从源到监听者之间的传递要通过适配类来"转发"。例如:当事件源发出一个事件,而有几个事件监听者对象都可接收该事件,但只有指定对象做出反应时,就要在事件源与事件监听者之间插入一个事件适配器类,由适配器类来指定事件应该是由哪些监听者来响应。

  适配类成为了事件监听者,事件源实际是把适配类作为监听者注册入监听者队列中,而真正的事件响应者并未在监听者队列中,事件响应者应做的动作由适配类决定。目前绝大多数的开发工具在生成代码时,事件处理都是通过适配类来进行的。

  JavaBeans用户化

  JavaBeans开发者可以给一个Beans添加用户化器(Customizer)、属性编辑器(PropertyEditor)和BeansInfo接口来描述一个Beans的内容,Beans的使用者可在构造环境中通过与Beans附带在一起的这些信息来用户化Beans的外观和应做的动作。一个Beans不必都有BeansCustomizer、PrpertyEditor和BeansInfo,根据实际情况,这些是可选的,当有些Beans较复杂时,就要提供这些信息,以Wizard的方式使Beans的使用者能够用户化一个Beans。有些简单的Beans可能这些信息都没有,则构造工具可使用自带的透视装置,透视出Beans的内容,并把信息显示到标准的属性表或事件表中供使用者用户化Beans,前几节提到的Beans的属性、方法和事件名要以一定的格式命名,主要的作用就是供开发工具对Beans进行透视。当然也是给程序员在手写程序中使用Beans提供方便,使他能观其名、知其意。

  用户化器接口(Customizer Interface)

  当一个Beans有了自己的用户化器时,在构造工具内就可展现出自己的属性表。在定义用户化器时必须要实现java.Beanss.Customizer接口。例如,下面是一个"按钮"Beans的用户化一器:

  public class OurButtonCustomizer

  extends Panel implements Customizer {

   ... ...

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:JSP/Servlet 中的汉字编码问题

下一篇:J2SE中的序列化的认识