龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

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

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
开发工具也可使用changes的removePropertyChangeListener方法,从l中注销指定的对象,使alden3的ourString属性的改变不再与这个对象有关。 当然,当程序员手写代码

  开发工具也可使用changes的removePropertyChangeListener方法,从l中注销指定的对象,使alden3的ourString属性的改变不再与这个对象有关。

  当然,当程序员手写代码编制程序时,也可直接调用这两个方法,把其它Java对象与alden3挂接。

  4. Constrained属性

  一个JavaBeans的constrained属性,是指当这个属性的值要发生变化时,与这个属性已建立了某种连接的其它Java对象可否决属性值的改变。constrained属性的监听者通过抛出PropertyVetoException来阻止该属性值的改变。例:下面程序中的constrained属性是PriceInCents。

  public class JellyBeans extends Canvas{
  private PropertyChangeSupport changes=new PropertyChangeSupport(this);
  private VetoableChangeSupport Vetos=new VetoableChangeSupport(this);
  /*与前述changes相同,
  可使用VetoableChangeSupport对象的实例Vetos中的方法,
  在特定条件下来阻止PriceInCents值的改变。*/

  ......
  public void setPriceInCents(int newPriceInCents) throws PropertyVetoException {
  /*方法名中throws PropertyVetoException的作用是当有
  其它Java对象否决PriceInCents的改变时,
  要抛出例外。*/
  /* 先保存原来的属性值*/

  int oldPriceInCents=ourPriceInCents;
  /**点火属性改变否决事件*/
  vetos.fireVetoableChange("priceInCents",new Integer(OldPriceInCents),new Integer(newPriceInCents));

  /**若有其它对象否决priceInCents的改变,
  则程序抛出例外,不再继续执行下面的两条语句,
  方法结束。若无其它对象否决priceInCents的改变,
  则在下面的代码中把ourPriceIncents赋予新值,
  并点火属性改变事件*/

  ourPriceInCents=newPriceInCents;
  changes.firePropertyChange("priceInCents", new Integer(oldPriceInCents), new Integer(newPriceInCents));
  }

  /**与前述changes相同,
  也要为PriceInCents属性预留接口,
  使其它对象可注册入PriceInCents否决改变监听者队列中,
  或把该对象从中注销

  public void addVetoableChangeListener(VetoableChangeListener l)
  {
  vetos.addVetoableChangeListener(l);
  }
  public void removeVetoableChangeListener(VetoableChangeListener l){
  vetos.removeVetoableChangeListener(l);
  }
  ......
  }


  从上面的例子中可看到,一个constrained属性有两种监听者:属性变化监听者和否决属性改变的监听者。否决属性改变的监听者在自己的对象代码中有相应的控制语句,在监听到有constrained属性要发生变化时,在控制语句中判断是否应否决这个属性值的改变。

  总之,某个Beans的constrained属性值可否改变取决于其它的Beans或者是Java对象是否允许这种改变。允许与否的条件由其它的Beans或Java对象在自己的类中进行定义。

  事件状态对象(Event State Object)

  与事件发生有关的状态信息一般都封装在一个事件状态对象中,这种对象是java.util.EventObject的子类。按设计习惯,这种事件状态对象类的名应以Event结尾。例如:

  public class MouseMovedExampleEvent extends java.util.EventObject
  {
  protected int x, y;
  /* 创建一个鼠标移动事件MouseMovedExampleEvent */
  MouseMovedExampleEvent(java.awt.Component source, Point location) {
  super(source);
  x = location.x;
  y = location.y;
  }
  /* 获取鼠标位置*/
  public Point getLocation() {
  return new Point(x, y);
  }
  }

  事件监听者接口(EventListener Interface)与事件监听者

  由于Java事件模型是基于方法调用,因而需要一个定义并组织事件操纵方法的方式。JavaBeans中,事件操纵方法都被定义在继承了java.util.EventListener类的EventListener接口中,按规定,EventListener接口的命名要以Listener结尾。任何一个类如果想操纵在EventListener接口中定义的方法都必须以实现这个接口方式进行。这个类也就是事件监听者。例如:

  /*先定义了一个鼠标移动事件对象*/
  public class MouseMovedExampleEvent
  extends java.util.EventObject {
  // 在此类中包含了与鼠标移动事件有关的状态信息
     ...
  }
  /*定义了鼠标移动事件的监听者接口*/
  interface MouseMovedExampleListener
  extends java.util.EventListener {
  /*在这个接口中定义了鼠标移动事件监听者所应支持的方法*/
  void mouseMoved(MouseMovedExampleEvent mme);
  }

精彩图集

赞助商链接