关于JavaBean的PropertyChangeListener
来源:互联网 发布:觉醒 凯特肖邦 知乎 编辑:程序博客网 时间:2024/05/26 19:16
本文主要介绍如何使用PropertyChangeSupport类来支持关联属性事件的触发。
1.关联属性
关联属性,也称之为绑定属性。绑定属性会在属性值发生变化时,通知所有相关的监听器。为了实现一个绑定属性,必须实现两个机制。
1) 无论何时,只要属性的值发生变化,该bean必须发送一个PropertyChange事件给所有已注册的监听器。该变化可能发生在调用set方法时,或者程序的用户做出某种动作时。
2) 为了使感兴趣的监听器能够进行注册,bean必须实现以下两个方法:
void addPropertyChangeListene
void removePropertyChangeList
2.使用PropertyChangeSupport
可以通过java.bean包下的PropertyChangeSupport类来管理监听器。要使用这个类,bean必须有一个此类的数据域。
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
这样就可以将添加和移除监听器的任务交给这个对象。
public void addPropertyChangeListene
changes.addPropertyChangeListene
}
public void removePropertyChangeList
changes.removePropertyChangeList
}
当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
使用这个类
还有一个好处是,这个类支持fire带索引的属性改变事件(详见java.bean.IndexedPropertyChangeEve
void fireIndexedPropertyChang
4.示例
MyBoundBean类(具体代码见附件)是一个JavaBean,我们关注它的唯一一个属性ourString的变化情况,它的初始值是Hello。并通过PropertyChange类来管理监听器。注意在set方法中会调用firePropertyChange方法。
MyBoundBean.java
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class MyBoundBean {
String ourString = "Hello";
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
public void setString(String newString) {
String oldString = ourString;
ourString = newString;
changes.firePropertyChange("ourString", oldString, newString);
}
public String getString() {
return ourString;
}
public void addPropertyChangeListene
changes.addPropertyChangeListene
}
public void removePropertyChangeList
changes.removePropertyChangeList
}
}
MyBoundBean b = new MyBoundBean();
…
public void actionPerformed(ActionEvent e) {
jButton1.setText(textBox.getText());
b.setString(textBox.getText());
}
目标bean的属性一改变(注意,初始值是"Hello"),将会触发propertyChange方法的执行。将文本框的内容设置为目标bean的ourString属性的旧值,同时,将jButton2的test设置成目标bean的ourString属性的新值。
public void propertyChange(PropertyChangeEvent e) {
if (e.getSource() == b) {
textBox.setText(e.getOldValue().toString());
jButton2.setText(e.getNewValue().toString());
}
}
如果不实现PropertyChangeListener接口的话,可以使用匿名内部类来达到同样的效果。(具体代码见附件MyCallBound2.java)
MyBoundBean b = new MyBoundBean();
…
b.addPropertyChangeListene
public void propertyChange(PropertyChangeEvent e) {
// 这样一来,我们就可以用自己定义的名字实现事件
ourString_propertyChange(e);
}
});
这样一来,我们就可以用自己定义的名字实现事件。
void ourString_propertyChange(PropertyChangeEvent e) {
if (e.getSource() == b) {
textBox.setText(e.getOldValue().toString());
jButton2.setText(e.getNewValue().toString());
}
}
- 关于JavaBean的PropertyChangeListener
- java的PropertyChangeListener
- PropertyChangeListener
- PropertyChangeListener
- 关于JavaBean的使用!!!
- 关于javabean的学习!
- 关于javabean的学习
- 关于JavaBean的理解
- 关于JavaBean的运行
- java propertyChangeListener 观察者模式的实现
- JavaBeans的PropertyChangeListener系列类用法
- PropertyChangeListener关联属性的简单介绍
- 关于javabean的一次讨论
- 关于JavaBean的一些理解
- 一篇关于javabean的教程
- 一篇关于javabean的教程
- 关于获取javaBean的属性。
- 一篇关于javabean的教程
- 题解:Trapping Rain Water
- 队列和栈的区别
- JAVA算法基础 求最大公约数和最小公倍数
- 第十四届浙江省赛 ZOJ 3962~3965 【E,F,G,H】 (其他并不准备补。)
- JavaScript 3.1 补充:谈谈JS的全局变量跟局部变量(转载)
- 关于JavaBean的PropertyChangeListener
- 坚持#第171天~尽己所能、辛德勒、珍惜
- I5 4590 台式机安装黑苹果最新版笔记
- 十三年来,淘宝走过的大数据之路
- 交通车路拥挤预警(LetuAPP)
- C++PrimerPlus第九章学习笔记——内存模型和名称空间
- java并发工具
- 八进制
- xsteam解析xml