源组件有属性,属性改变了,就会触发PropertyChangeListener监听。
源组件(bean)绑定(bound)一个属性,属性改变,就监听得到。一般用界面UI监听模型的属性变化。
源组件(button)、绑定属性(background)、事件(PropertyChangeEvent)、监听器(PropertyChangeListener)。
事件(PropertyChangeEvent):getPropertyName()、getNewValue()。getOldValue()。
监听器(PropertyChangeListener):public void propertyChange(PropertyChangeEvent propertyChangeEvent)。
设计源组件:
源组件中有成员,即工具类PropertyChangeSupport,它可以注册或删除监听器、它可以调用事件触发方法。
工具类PropertyChangeSupport中触发事件firePropertyChange(prop, oldValue, newValue)方法。
prop属性字符串、oldValue属性的旧值、newValue属性的新值。
例子1:
package Listener;
import java.beans.PropertyChangeEvent; //事件
import java.beans.PropertyChangeListener; //监听
import java.beans.PropertyChangeSupport; //支持
/**
*
* @author maxin
*/
public class PropertyBean { //源组件(bean)
private String demoName;
//这是一个实用工具类,支持绑定 (bound) 属性的 bean 可以使用该类。
//可以使用此类的实例作为 bean 的成员字段,并将各种工作委托给它。
PropertyChangeSupport listeners = new PropertyChangeSupport(this);
public PropertyBean() {
demoName = "initValue";
}
public String getDemoName() {
return demoName;
}
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); // 系统方法
}
/**
* 触发属性改变的事件
*/
protected void firePropertyChange(String prop, Object oldValue, Object newValue) {
listeners.firePropertyChange(prop, oldValue, newValue); // 系统方法
}
public static void main(String[] args) {
PropertyBean beans = new PropertyBean();
beans.addPropertyChangeListener(new PropertyChangeListener(){
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("OldValue:"+evt.getOldValue());
System.out.println("NewValue:"+evt.getNewValue());
System.out.println("tPropertyName:"+evt.getPropertyName());
}});
beans.setDemoName("test");
}
}
例子2
package Listener;
//属性监听
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class BoundSample {
public static void main(String args[]) {
JFrame frame = new JFrame("Button Sample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JButton button1 = new JButton("Select Me");
final JButton button2 = new JButton("No Select Me");
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
JButton button = (JButton) actionEvent.getSource();
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
button.setBackground(new Color(red, green, blue));
}
};
PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
String property = propertyChangeEvent.getPropertyName(); //得到属性名
if ("background".equals(property)) {
button2.setBackground((Color) propertyChangeEvent
.getNewValue()); //得到属性值
}
}
};
button1.addActionListener(actionListener);
button1.addPropertyChangeListener(propertyChangeListener);
button2.addActionListener(actionListener);
Container contentPane = frame.getContentPane();
contentPane.add(button1, BorderLayout.NORTH);
contentPane.add(button2, BorderLayout.SOUTH);
frame.setSize(300, 100);
frame.setVisible(true);
}
}