这段代码是在使用PropertyChangeSupport工具类来改变JavaBean类的绑定属性值,先来开下API给这个类的解释吧:
这是一个实用工具类,支持绑定 (bound) 属性的 bean 可以使用该类。可以使用此类的实例作为 bean 的成员字段,并将各种工作委托给它。
1.先说下绑定属性吧
在JavaBean的设计中,按照属性的不同作用又细分为四类:单值属性、索引属性、关联属性、限制属性。关联属性,也称之为绑定属性。绑定属性会在属性值发生变化时,通知所有相关的监听器。
为了实现一个绑定属性,必须实现两个机制:
1) 无论何时,只要属性的值发生变化,该bean必须发送一个PropertyChange事件给所有已注册的监听器。
2) 为了使监听器能够注册,bean必须实现以下两个方法:void addPropertyChangeListener(PropertyChangeListener listener);
void removePropertyChangerListener(PropertyChangerListener listener);
2.使用PropertyChangeSupport管理监听器
可以通过java.bean包下的PropertyChangeSupport类来管理监听器。要使用这个类,bean必须有一个此类的数据域。private PropertyChangeSupport listeners = new PropertyChangeSupport(this);
1)这样可以将添加和移除监听器的任务交给这个对象,也就是实现第二个机制:
public void addPropertyChangeListener(PropertyChangeListener listener)
{
listeners.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
listeners.removePropertyChangeListener(listener);
}
2)当bean的属性发生变化时,使用PropertyChangeSupport对象的firePropertyChange方法,会将一个事件发送给所有已经注册的监听器。该方法有三个参数:属性的名字、旧的值以及新的值。属性的值必须是对象,如果是基本数据类型,则必须进行包装。listeners.firePropertyChange("ourString", oldString, newString);
所有注册的监听器实现PropertyChangeListener接口,该接口中只有一个方法。public void propertyChange(PropertyChangeEvent e)
当bean的属性值发生变化时,该方法中的代码就会被触发。可以通过e.getOldValue();
e.getNewValue();来得到changes.firePropertyChange("ourString", oldString, newString);中的oldString和newString
3.为什么要使用PropertyChangeSupport
使用这个类管理监听器的好处是,它是线程安全的。如果使用一个循环体来set Bean的属性,则这个类可以保证所有监听器执行触发事件的有序。
还有一个好处是,这个类支持fire带索引的属性改变事件(详见java.bean.IndexedPropertyChangeEvent)。此时向注册的监听器发送一个PropertyChangeEvent的方法为:void fireIndexedPropertyChange(String PropertyName,int index,Object oldValue,Object newValue)
4.把你的代码稍稍改了一下做个实例演示。我只注释一部分,其他的都是一个道理- import java.beans.PropertyChangeEvent;
-
- import java.beans.PropertyChangeListener;
-
- import java.beans.PropertyChangeSupport;
-
- public class Test5 {
-
- private PropertyChangeSupport pcs = new PropertyChangeSupport(this);//要使用PropertyChangeSupport类,<font color="black">bean必须有一个此类的数据域。</font>
- private String site = "<a >www.itheima.com</a>";
- public Test5() {
-
- }
- public String getSite() {
-
- return site;
-
- }
- public void setSite(String newSite) {
- //将旧属性值进行改变
- String oldSite=site;
- site=newSite;
- pcs.firePropertyChange("site",oldSite,newSite);//<font color="black">将一个事件发送给所有已经注册的监听器</font>
- }
- //用这两个方法注册监视器
- public void addPropertyChangeListener(PropertyChangeListener l) {
-
- pcs.addPropertyChangeListener(l);
-
- }
- public void removePropertyChangeLister(PropertyChangeListener l) {
-
- pcs.removePropertyChangeListener(l);
-
- }
- public static void main(String[] args) {
-
- final Test5 bean = new Test5();
- bean.setSite("www.itcast.cn");
- bean.addPropertyChangeListener(new PropertyChangeListener() {
- @Override
- //重写类属性管理监视器的唯一方法
- public void propertyChange(PropertyChangeEvent evt) {
- //获取旧值和新值
- System.out.println(evt.getOldValue());
- System.out.println(evt.getNewValue());
- }
-
- });
- }
-
- }
复制代码 有个建议,只在需要使用final的情况下再使用它,不要处处都用
|