在 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);
   }
}

输出

                                                                    

更新于:2020 年 7 月 13 日

4K+ 查看次数

开启你的 职业生涯

完成课程即可获得认证

开始
广告