最近开始要着手写一个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



简单的对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,以及其四种属性之类的内容,也不是很了解。等了解了再进行补充吧。