Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不能用JavaBeans制作程序来监听其他组件_Java_Javabeans - Fatal编程技术网

不能用JavaBeans制作程序来监听其他组件

不能用JavaBeans制作程序来监听其他组件,java,javabeans,Java,Javabeans,这里有Purchase和PurchaseView类: import java.beans.PropertyVetoException; public class Main { public static void main(String[] args) { Purchase purch = new Purchase("Computer"); PurchaseView pView = new PurchaseView(); purch.addPropertyCha

这里有Purchase和PurchaseView类:

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

  }
}
我希望程序在数据属性更改时生成PurchaseView类中显示的输出。对我来说,它似乎得到了很好的实施,但不起作用

有什么想法吗?

你的想法是什么

我想你刚才在setData方法中使用旧值时犯了一个错误。应该是这样的:

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

注意你忘记了setData方法第一行的
这个
保留字,这意味着你取的是方法变量而不是类变量。

我的输出中没有任何内容。我实际上解决了这个问题。它与变量命名有关。我区分了数据和这个数据,但我的程序没有。我有一些类似于你的解决方案,但它不起作用。我将方法参数的名称从'data'更改为'aData',firePropertyChange传递了'aData'变量,它工作正常。
public void setData(String data) {
    String oldValue = this.data;
    this.data = data;
    propertyChange.firePropertyChange("data", oldValue, data);
}