1

我目前正在使用 PropertyChangeListeners,我想知道是否建议在将对象添加(或删除,就此而言)到索引属性(如 ArrayList)时触发属性更改。

public class SimpleBean implements Serializable
{
   private ArrayList<Matrix> mats;
   private PropertyChangeSupport pcs = new PropertyChangeSupport(this);

   public SimpleBean()
   {...}

   public void addMat(Matrix m)
   {
      pcs.firePropertyChange("mats", null, m); // I'm having trouble with the parameters
      mats.add(m);
   }

}

我正在阅读 PropertyChangeListener 教程,每当绑定属性的值发生更改时,似乎触发属性更改是合适的。好吧,我不太确定这是否意味着我应该在以任何方式修改属性时触发属性更改,或者仅当属性(或该属性的元素)被严格设置/重新分配给不同的值时。

在我的程序中,如果每次从 mats ArrayList 中删除或添加元素时可以更改多个类,那将非常方便,并且我认为 PropertyChangeListener 可以在这方面为我提供帮助。

请让我知道是否不建议使用此方法,以及其他类是否可以通过其他方式侦听并响应对索引属性的删除/添加。

4

1 回答 1

1

请参见以下示例:

public class SimpleBean implements Serializable {

    private ArrayList<Matrix> mats;
    private PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public void setMats(ArrayList<Matrix> mats) {
        if(mats.equals(this.mats))
            return;
        ArrayList<Matrix> oldMats = this.mats ;
        this.mats = mats ;
        pcs.firePropertyChange("mats", oldMats, mats);
    }

    public ArrayList<Matrix> getMats() {
        return mats;
    }

    public void setMat(int index, Matrix mat) {
        Matrix existing = index == mats.size() ? null : mats.get(index);
        if(existing.equals(mat))
            return;
        mats.remove(index);
        mats.add(index, mat);
        pcs.fireIndexedPropertyChange("mats", index, existing, mat);
    }

    public Matrix getMat(int index) {
        return mats.get(index);
    }

    public void addMat(Matrix m) {
        setMat(mats.size(), m);
    }

}

它实现了 propertyChange 和 indexedPropertyChange for mats

于 2015-08-07T10:49:57.257 回答