javaBean属性监听机制

说明:共有3个Java类
package com.a;
/**
<p>Title:属性监听  </p>

<p>Description: </p>

<p>Copyright: Copyright (c) 2009</p>

<p>Company: </p>

@author
@version 1.0

*/
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;

/**
 * 这是一个实用工具类,支持绑定 (bound) 属性的 bean 可以使用该类。
 * 可以使用此类的实例作为 bean 的成员字段,并将各种工作委托给它。 此类是可序列化的。
 * 在对它进行序列化时,它将保存(并恢复)本身可序列化的所有侦听器。在序列化期间,将跳过所有不可序列化的侦听器。
 * @author Administrator
 *
 */
public class PropertyChangeSupportTest {

// 临时的属性变量,为了侦听属性值的变化,该值的状态不再存储,每次的应用都是起初的状态,即変元
 transient protected PropertyChangeSupport listeners = new PropertyChangeSupport(this);
 /**
  * 向侦听器列表添加一个 PropertyChangeListener
  * @param listener 侦听器
  */
 public void addPropertyChangeListener(PropertyChangeListener listener)
 {
  if(listener == null)
  {
   throw new IllegalArgumentException();
  }
  listeners.addPropertyChangeListener(listener);
 }
 /**
  * 通知所有已注册侦听器的绑定属性更新,如果属性值发生改变,就会触发PropertyChangeEvent事件
  * @param prop 被更改属性的属性名称
  * @param old  属性的旧值
  * @param newValue  属性的新值
  */
 public void firePropertyChangeListener(String prop,Object old,Object newValue)
 {
  listeners.firePropertyChange(prop, old, newValue);
 }
 /**
  * 从侦听器列表移除一个为所有属性注册的 PropertyChangeListener
  * 如果将 listener 多次添加到同一事件源,则在被移除之后,它至少将被通知一次
  * @param listener 侦听器
  */
 public void removePropertyChangeListener(PropertyChangeListener listener)
 {
  listeners.removePropertyChangeListener(listener);
 }
}//end class
**********************************************************
**********************************************************
package com.a;

import java.rmi.Remote;
/**
<p>Title:属性监听  </p>

<p>Description: </p>

<p>Copyright: Copyright (c) 2009</p>

<p>Company: </p>

@author
@version 1.0

*/
public class BeanTest extends PropertyChangeSupportTest  {

//  此静态属性是提供侦听的属性名的,其值与下面的属性名一致
 public static final String TEST = "name";
// 定义私有的侦听属性
 private static String name =" null,null,null,null,null,null,null,null";
 
// private String age ="0";

 public String getName() {
  
  return this.name;
 }

 public void setName(String name) {
//      属性值未发生改变时,if判断在此仅打印出一条提示语句,返回程序控制权
  if(this.name.equals(name))
  {
//   System.out.println(this.name);
//   System.out.println(name);
   System.out.println("BeanTest的属性name没有变化");
//   程序的控制流程到此结束,不再执行下面的代码
   return;
  }
//  此方法只有在属性值改变后触发,为注册的监听器激发一个PropertyChangeEvent事件
//  如果给定事件的旧值和新值相等并且都是非 null 的,则不会激发事件
  this.firePropertyChangeListener(this.TEST, this.getName(), name);
  
//  这句可以说明点火方法不会修改属性值,实际在propertyChange()方法执行后也是一样的
//  System.out.println("fire与propertyChange方法后的值为:"+this.getName());
//  这句才把新值传了过去,修改了属性值,此句应在调用fire方法后执行
  this.name = name;
//  System.out.println(this.name);
//  this.firePropertyChangeListener(this.name, null, name);
 }

// public String getAge() {
//  return age;
// }
//
// public void setAge(String age) {
//  if(this.age.equals(age))
//  {
//   System.out.println("BeanTest的属性age没有改变");
//   return;
//  }
//  this.firePropertyChangeListener("age", this.getAge(), age);
// 
//  this.age = age;
// }
 
 
 
}//end class
************************************************************
************************************************************
package com.a;
/**
<p>Title:属性监听  </p>

<p>Description: </p>

<p>Copyright: Copyright (c) 2009</p>

<p>Company: </p>

@author
@version 1.0

*/
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import com.byh.pubsub.JMSpubsub;
/**
 * listeners接口的方法propertyChange(PropertyChangeEvent evt)可以获得在属性值发生变化时
 * 所激发的propertyChange的事件通知,及对此事件的处理
 * 该类实现了PropertyChangeListener接口后就是一个PropertyChangeListener实体类
 */
public class BeanTestListener implements PropertyChangeListener {

 /**
  * 实现接口的方法,获得监听的事件源,在firePropertyChangeListener方法调用后执行该方法
  * evt 是描述事件源
  */
// 8.1改变
// private String cto;
 public void propertyChange(PropertyChangeEvent evt) {
  
//  调试
//  System.out.println(BeanTest.TEST);

//  getPropertyName()方法获取已更改属性的编程名称,返回被更改属性的编程名称。如果多个属性被更改,则返回 null
  if(evt.getPropertyName().equals(BeanTest.TEST))
  {
//  调试,此处方法的执行也不会改变侦听的属性值
//   System.out.println("侦听时的值为:"+test.getName());
//      返回的被更改的属性名是空字符串为真时
//   System.out.println("BeanTest的属性name改变");
   
  }
//  测试age
//  if(evt.getPropertyName().equals("age"))
//  {
//   System.out.println("BeanTest的属性age改变");
//  }
//  调试
//  System.out.println(evt.getPropertyName().equals(test.getName()));
  System.out.println("侦听得到的发生变化的属性名:"+evt.getPropertyName()+"新值:"+evt.getNewValue()+"    "+"旧值:"+evt.getOldValue());
//这里可以写当Bean得属性变化后的处理代码    

 }
/**
 * main方法
 */
// public static void main(String args[])
// {
//  实例化bean
//  BeanTest test = new BeanTest();
//  实例化BeanTestListener
//  BeanTestListener lis = new BeanTestListener();
//      调用bean继承父类的方法,为该类所有属性注册一个监听器
//  test.addPropertyChangeListener(lis);
//  set方法中包含firePropertyChangeListener()方法
//  test.setName("2");
  test.setName("600000.SS,25.30,25.13,25.39,24.79,68261672");
//  test.setName("test3");
//  测试age属性
//  test.setAge("1");
//  调用bean继承父类的方法,为该类所有属性注册的监听器移除,
//  test.removePropertyChangeListener(lis);

//  test.setName("test9");
//  打印出test中name的属性
//  System.out.println("最新的name值:"+test.getName());
//  打印出test中age的属性
//  System.out.println("最新的age值:"+test.getAge()); 
  
// }
// public String getCto() {
//  return cto;
// }
// public void setCto(String cto) {
//  this.cto = cto;
// }
 
}//end class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值