void
addPropertyChangeListener(PropertyChangeListener listener);
void
removePropertyChangeListener(PropertyChangeListener listener);
|
private
PropertyChangeSupport
changes
=
new
PropertyChangeSupport(
this
);
|
public
void
addPropertyChangeListener(PropertyChangeListener listener) {
changes
.addPropertyChangeListener(listener);
}
public
void
removePropertyChangeListener(PropertyChangeListener listener) {
changes
.removePropertyChangeListener(listener);
}
|
changes
.firePropertyChange(
"ourString"
, oldString, newString);
|
public
void
propertyChange(PropertyChangeEvent e);
|
e.getOldValue();
e.getNewValue();
|
void
fireIndexedPropertyChange(String PropertyName,
int
index,Object oldValue,Object newValue);
|
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
addPropertyChangeListener(PropertyChangeListener listener) {
changes
.addPropertyChangeListener(listener);
}
public
void
removePropertyChangeListener(PropertyChangeListener listener) {
changes
.removePropertyChangeListener(listener);
}
}
|
MyBoundBean
b
=
new
MyBoundBean();
…
public
void
actionPerformed(ActionEvent e) {
jButton1
.setText(
textBox
.getText());
b
.setString(
textBox
.getText());
}
|
public
void
propertyChange(PropertyChangeEvent e) {
if
(e.getSource() ==
b
) {
textBox
.setText(e.getOldValue().toString());
jButton2
.setText(e.getNewValue().toString());
}
}
|
MyBoundBean
b
=
new
MyBoundBean();
…
b
.addPropertyChangeListener(
new
PropertyChangeListener() {
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());
}
}
|
本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/36838
源代码如下:
package com.hexun.sample; 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 addPropertyChangeListener(PropertyChangeListener listener) { changes.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { changes.removePropertyChangeListener(listener); } }
package com.hexun.sample; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; @SuppressWarnings("serial") public class MyCallBound1 extends JFrame implements ActionListener, PropertyChangeListener { JPanel contentPane; JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); JTextField textBox = new JTextField(); MyBoundBean b = new MyBoundBean(); public static void main(String[] args) { MyCallBound1 frame = new MyCallBound1();// 创建窗口类 frame.setVisible(true); // 显示窗口类 } // 窗口类构造器 public MyCallBound1() { jbInit(); // 初始化 } // 控件初始化 private void jbInit() { contentPane = (JPanel) this.getContentPane(); // 因为在声明该类时使用了extends命令,表示该类是JFrame的继承类, // 所以可以使用this关键字 contentPane.setLayout(null); this.setSize(new Dimension(400, 200)); this.setTitle("关联属性"); textBox.setBounds(10, 20, 150, 25); jButton1.setText("jButton1"); jButton1.setBounds(170, 20, 120, 25); jButton2.setText("jButton2"); jButton2.setBounds(170, 80, 120, 25); jButton1.addActionListener(this);// 加入Action事件 jButton2.addActionListener(this);// 加入Action事件 contentPane.add(textBox); // 加入按钮 contentPane.add(jButton1); // 加入按钮 contentPane.add(jButton2);// 加入按钮 b.addPropertyChangeListener(this); // 加入属性变化侦听器 } // 关联属性事件的实现代码 public void propertyChange(PropertyChangeEvent e) { if (e.getSource() == b) { textBox.setText(e.getOldValue().toString()); jButton2.setText(e.getNewValue().toString()); } } protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } // 这是动作侦听器实现代码 // 如果使用了implements ActionListener // 这个代码就必须要实现 public void actionPerformed(ActionEvent e) { jButton1.setText(textBox.getText()); b.setString(textBox.getText()); } }
package com.hexun.sample; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; //这是不使用直接实现PropertyChangeListener接口 //而是使用myBoundBean内重载的addPropertyChangeListener //方法实现关联侦听器的方式 @SuppressWarnings("serial") public class MyCallBound2 extends JFrame implements ActionListener { JPanel contentPane; JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); JTextField textBox = new JTextField(); MyBoundBean b = new MyBoundBean(); public static void main(String[] args) { MyCallBound2 frame = new MyCallBound2();// 创建窗口类 frame.setVisible(true); // 显示窗口类 } // 窗口类构造器 public MyCallBound2() { jbInit(); // 初始化 } // 控件初始化 private void jbInit() { contentPane = (JPanel) this.getContentPane(); // 因为在声明该类时使用了extends命令,表示该类是JFrame的继承类, // 所以可以使用this关键字 contentPane.setLayout(null); this.setSize(new Dimension(400, 200)); this.setTitle("关联属性"); textBox.setBounds(10, 20, 150, 25); jButton1.setText("jButton1"); jButton1.setBounds(170, 20, 120, 25); jButton2.setText("jButton2"); jButton2.setBounds(170, 80, 120, 25); jButton1.addActionListener(this);// 加入Action事件 jButton2.addActionListener(this);// 加入Action事件 contentPane.add(textBox); // 加入按钮 contentPane.add(jButton1); // 加入按钮 contentPane.add(jButton2);// 加入按钮 // 加入属性变化侦听器 b.addPropertyChangeListener(new PropertyChangeListener() { 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()); } } protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } // 这是动作侦听器实现代码 // 如果使用了implements ActionListener // 这个代码就必须要实现 public void actionPerformed(ActionEvent e) { jButton1.setText(textBox.getText()); b.setString(textBox.getText()); } }