[Java学习小记]使用PropertyChangeSupport来监听变量的变化

最近开始要着手写一个web项目 ,之前没怎么 写过Java ,所以觉得蛮有必要把每天学习到的一些知识点或者解决的一些问题给记录下来 。一来供自己在整理过程中掌握巩固,二来也为以后再次出现该问题时能快速效率地查阅自己所写的文章,也希望能够对查看本文的读者有些许帮助。平时没怎么写过这种博客,写的不好也请见谅,也希望能够慢慢地锻炼自己这项能力吧。前言就不多说了。


今天要处理的问题是:监听一个变量,当该变量的值出现变化时能够获知,并进行相应处理。

使用java.bean.PropertyChangeSupport类。看如下的构造方法,其实就是将你要控制的对象绑定到该工具中。

PropertyChangeSupport changes = new PropertyChangeSupport(aclass);

使用到如下3种方法:

changes.addPropertyChangeListener(listener);
changes.removePropertyChangeListener(listener);
changes.firePropertyChange("name", null, name);

分别是注册监听器,移除监听器,和触发一个监听事件。其中name就是aclass中一个String属性变量。


MyClass aclass = new MyClass();
		PropertyChangeSupport changes = new PropertyChangeSupport(aclass);
		changes.addPropertyChangeListener(new PropertyChangeListener() {
			
			@Override
			public void propertyChange(PropertyChangeEvent evt) {
				// TODO Auto-generated method stub
				System.out.println("change");
			}
		});
		
		String str = aclass.getName();
		aclass.setName("11");
		changes.firePropertyChange("name", str, aclass.getName());

使用匿名内部类来实现监听器,在propertyChange方法中实现你要的处理。该方法会在firePropertyChange触发了事件之后捕获该事件然后执行。也可以通过implements PropertyChangeListener接口实现。

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

注意:如果str 和aclass.getName(),也就是旧值和新值是相同的,不会触发事件。如果将str改为Null,则都会触发事件。

结果:

change


       因为一般变量值的变化都是调用了setter方法,所以我们可以在MyClass中直接绑定PropertyChangeSupport对象。然后在需要监听的属性的setter方法中调用firePropertyChange方法,并将添加监听器和移除监听器的方法也由在MyClass中实现。

简单的对MyClass修改如下。

public class MyClass {
	private String name = "1";
	private String age = "2";
	private PropertyChangeSupport changes = new PropertyChangeSupport(this);
	
	public void setName(String name) {
		String OldName = this.name;
		this.name = name;
		changes.firePropertyChange("name", OldName, name);
	}
	public String getName() {
		return name;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getAge() {
		return age;
	}
	
	public void addPropertyChangeListener(PropertyChangeListener listener) {
	       changes.addPropertyChangeListener(listener);
	    }
	 
	public void removePropertyChangeListener(PropertyChangeListener listener) {
	       changes.removePropertyChangeListener(listener);
	    }

}

然后由该类直接调用

MyClass aclass = new MyClass();
aclass.addPropertyChangeListener(new PropertyChangeListener() {
	@Override
	public void propertyChange(PropertyChangeEvent evt) {
	// TODO Auto-generated method stub
		System.out.println(evt.getPropertyName());
		System.out.println(evt.getOldValue());
		System.out.println(evt.getNewValue());	
	}
});
aclass.setName("new");

 输出结果: 

name
1
new

可以参考,http://zhangjunhd.blog.51cto.com/113473/36838/

http://www.blogjava.net/fuxueliang/archive/2006/07/18/58738.html

至于提到的javabean,以及其四种属性之类的内容,也不是很了解。等了解了再进行补充吧。






评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值