无法与Javabeans制作程序来收听其他组件


import java.beans.PropertyVetoException;
public class Main {
  public static void main(String[] args) {
    Purchase purch = new Purchase("Computer");
    PurchaseView pView = new PurchaseView();
    purch.addPropertyChangeListener(pView);
    try {
      purch.setData("Notebook");
      System.out.println(purch);
    } catch (PropertyVetoException exc) {
      System.out.println(exc.getMessage());
    }
  }
}

您有购买和购买视图类:

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyVetoException;
public class Purchase {
    private String data;
    private PropertyChangeSupport propertyChange = new PropertyChangeSupport(this);
    public Purchase(String data) {
        this.data = data;
    }
    public synchronized void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChange.addPropertyChangeListener(listener);
    }
    public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
        propertyChange.removePropertyChangeListener(l);
    }
    public String getData() {
        return data;
    }
    public void setData(String data) {
        String oldValue = data;
        this.data = data;
        propertyChange.firePropertyChange("data", oldValue, data);
    }
    }
}  

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class PurchaseView implements PropertyChangeListener{
    public PurchaseView() {}
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        String propName = evt.getPropertyName();
        if(propName.equals("data")) {
            String oldValue = (String) evt.getOldValue();
            String newValue = (String) evt.getNewValue();
            System.out.println("Change value of: " + evt.getPropertyName() + " from: " + oldValue + " to: " + newValue);
        }
    }
}

我希望该程序在更改数据属性时在puphieView类中显示的输出。它似乎对我实现了,但行不通。

有什么想法?

您的输出是什么?

我认为您刚在setData方法中犯了一个错误。应该是这样的:

public void setData(String data) {
    String oldValue = this.data;
    this.data = data;
    propertyChange.firePropertyChange("data", oldValue, data);
}

请注意,您忘记了 this在setData方法的第一行中保留的单词,wich表示您将方法变量代替类变量。

最新更新