【问题标题】:Adding an item to an indexed property - PropertyChangeSupport将项目添加到索引属性 - PropertyChangeSupport
【发布时间】:2015-08-06 17:56:20
【问题描述】:

我目前正在使用 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 教程,似乎每当绑定属性的值发生更改时触发属性更改是合适的。好吧,我不太确定这是否意味着我应该在属性被 any 方式修改时触发属性更改,或者仅在严格设置属性(或该属性的元素)时触发属性更改/重新分配给不同的值。

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

如果不建议使用此方法,以及是否有其他方法可以让其他类可以侦听并响应对索引属性的删除/添加,请告诉我。

【问题讨论】:

  • 看合同,修改前发送mats,修改后发送mats。我怀疑那是你想要的。您可能更想使用fireIndexedPropertyChange
  • 好的,但是如果我尝试 fireIndexedPropertyChange,pcs.fireIndexedPropertyChange("mat", mats.size(), null, m) 会是合适的替代品吗?由于我所学到的关于更改绑定属性的所有内容都与将属性分配给不同的东西有关,而不是添加到/删除它,所以我在参数化此方法时遇到了麻烦。 @KDM

标签: java javabeans propertychangelistener


【解决方案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);
    }

}

它实现了mats 的 propertyChange 和 indexedPropertyChange。

【讨论】:

  • 在您的setMat 方法中,如果index = mats.size(),那么mats.remove(index) 不会导致ArrayIndexOutOfBoundsException?不仅如此,既然existing 将被设置为null,那么existing.equals(mat) 不会导致NullPointerException 吗? @KDM
  • 我更关注Java bean的契约,而不是运行时错误。只需为添加到列表末尾的特殊情况添加保护即可。
  • 我明白了。好吧,我会尝试自己实现它。另外,谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多