java的PropertyChangeListener


看源码时,看到用这个属性改变的监听,顺便学习下。

相关的类都在java.beans包。


在JavaBean的设计中,按照属性的不同又细分为四类:

单值属性、索引属性、关联属性、限制属性


这里主要介绍如何使用PropertyChangeSupport类来支持关联属性事件的触发。

1、关联属性

      关联属性,也称之为绑定属性.绑定属性在属性发生变化时,会通知相关的监听器.为了通知相关的监听器,

为了实现一个绑定属性,必须实现两个机制。

     

1) 无论何时,只要属性的值发生变化,该bean必须发送一个PropertyChange事件给所有已注册的监听器。该变化可能发生在调用set方法时,或者程序的用户做出某种动作时。

2) 为了使感兴趣的监听器能够进行注册,bean必须实现以下两个方法:

void addPropertyChangeListener(PropertyChangeListener listener);
void removePropertyChangeListener(PropertyChangeListener listener)

2.使用PropertyChangeSupport 管理 监听器

  可以通过java.bean包下的PropertyChangeSupport类来管理监听器。要使用这个类,bean必须有一个此类的数据域。

private PropertyChangeSupport changes = new PropertyChangeSupport(this);

  这样就可以将添加和移除监听器的任务交给这个对象。

public void addPropertyChangeListener(PropertyChangeListener listener) {
  changes.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
  changes.removePropertyChangeListener(listener);
}


当bean的属性发生变化时,使用PropertyChangeSupport对象的firePropertyChange方法,它会将一个事件发送给所有已经注册的监听器。该方法有三个参数:属性的名字、旧的值以及新的值。属性的值必须是对象,如果是简单数据类型,则必须进行包装。

changes.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);

package com.study.propertychangelistener;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class DemoBeans {

	private String demoName;

	PropertyChangeSupport listeners = new PropertyChangeSupport(this);

	public DemoBeans() {
		demoName = "initValue";
	}

	public void setDemoName(String demoName) {
		String oldValue = this.demoName;
		this.demoName = demoName;

		firePropertyChange("demoName", oldValue, demoName);
	}

	public void addPropertyChangeListener(PropertyChangeListener listener) {
		listeners.addPropertyChangeListener(listener);
	}

	public void removePropertyChangeListener(PropertyChangeListener listener) {
		listeners.removePropertyChangeListener(listener);
	}

	private void firePropertyChange(String prop, String oldValue,
			String newValue) {
		
		//报告已注册监听器的绑定更新
		listeners.firePropertyChange(prop, oldValue, newValue);
	}

	public static void Main(String[] args) {
		DemoBeans bean = new DemoBeans();
		bean.addPropertyChangeListener(new PropertyChangeListener() {

			@Override
			public void propertyChange(PropertyChangeEvent evt) {
				System.out.println("OldValue :" + evt.getOldValue());
				System.out.println("NewValue :" + evt.getNewValue());
				System.out.println("NewValue :" + evt.getPropertyName());
			}
		});

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值