在 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); } }
输出
广告