在 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+ 檢視次數

開啟你的 職業生涯

完成課程即可獲得認證

開始
廣告
© . All rights reserved.