在 Java 中,如何使用 lambda 表达式实现 PropertyChangeListener?
PropertyChangeListener 是 java.beans 包中的一个函数接口。它有抽象方法 propertyChange(),并且在绑定属性更改时调用。此方法采用一个 PropertyChangeEvent 参数,其中包含有关事件源和已更改属性的详细信息。支持绑定属性的 bean 可以使用 PropertyChangeSupport 。它可以管理监听器列表并分派属性更改事件。PropertyChangeListener 的实现者扮演观察者的角色,而包装 PropertyChangeSupport 的 bean 是可观察者。
语法
void propertyChange(PropertyChangeEvent evt)
示例
import java.beans.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class PropertyChangeListenerLambdaTest {
public static void main(String [] args) {
new PropertyChangeListenerLambdaTest();
}
public PropertyChangeListenerLambdaTest() {
JFrame frame = new JFrame("First Frame");
final JLabel label = new JLabel("Observing...");
label.setFont(new Font("Dialog", Font.PLAIN, 18));
frame.add(label);
frame.getRootPane().setBorder(new EmptyBorder(10, 10, 10, 10));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 150);
frame.setLocation(200, 200);
frame.setVisible(true);
MessageBean bean = new MessageBean();
bean.addPropertyChangeListener(e -> // lambda expression
label.setText((String) e.getNewValue())
);
new Frame1(bean);
}
private class Frame1 {
private int clicks;
Frame1(MessageBean bean) {
JFrame frame = new JFrame("Second Frame");
JLabel label = new JLabel("Click anywhere to fire a property change event");
label.setFont(new Font("Dialog", Font.PLAIN, 18));
frame.add(label);
frame.getRootPane().setBorder(new EmptyBorder(10, 10, 10, 10));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(450, 150);
frame.setLocation(600, 200);
frame.setVisible(true);
frame.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
String data = "Click-count [" + ++clicks + "]";
bean.setValue(data);
}
});
}
}
}
class MessageBean {
private final PropertyChangeSupport support = new PropertyChangeSupport(this);
private String value;
public void addPropertyChangeListener(PropertyChangeListener listener) {
support.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
support.removePropertyChangeListener(listener);
}
public String getValue() {
return value;
}
public void setValue(String newValue) {
String oldValue = value;
value = newValue;
support.firePropertyChange("value", oldValue, newValue);
}
}输出
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
JavaScript
PHP