2015-08-06 7 views
1

В настоящее время я работаю с PropertyChangeListeners, и я хочу знать, было бы целесообразно, если бы объект был добавлен (или удален, если на то пошло), чтобы проиндексировать свойство таких как ArrayList.Добавление элемента к индексированному свойству - PropertyChangeSupport

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, и казалось, что было бы целесообразно, чтобы огонь изменения свойства, когда значение связанного имущества изменилось. Ну, я не был уверен, что это означает, что я должен уволить изменение свойства всякий раз, когда свойство было изменено на , любое значение означает или только тогда, когда свойство (или элемент этого свойства) было строго установлено/переназначено на другое значение ,

В моей программе было бы очень удобно, если бы несколько классов могли меняться каждый раз, когда элемент был удален или добавлен в маты ArrayList, и я подумал, что PropertyChangeListener может мне помочь в этом отношении.

Пожалуйста, дайте мне знать, если этот метод не рекомендуется, и если есть другой способ, который другие классы могут прослушивать и отвечать на удаление/дополнение к индексированным свойствам.

+1

Рассматривая контракт, вы должны отправить «маты» перед модификацией и «маты» после модификации. Я сомневаюсь, что это то, что вы хотите. Возможно, вы захотите использовать 'fireIndexedPropertyChange'. – KDM

+0

Хорошо, но если я попробую fireIndexedPropertyChange, будет ли 'pcs.fireIndexedPropertyChange (« mat », mats.size(), null, m)' подходящей заменой? Поскольку все, что я узнал об изменении связанных свойств, связано с назначением свойства чему-то другому, а не добавлению/удалению из него, у меня есть проблема с параметризацией этого метода. @KDM – novice

ответ

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 для mats.

+0

В вашем методе 'setMat', если' index' = 'mats.size()', то не будет 'mats.remove (index)' вызывать 'ArrayIndexOutOfBoundsException'? Не только это, так как 'existing' будет установлено в' null', не будет ли 'existing.equals (mat)' вызвать 'NullPointerException'? @KDM – novice

+1

Я больше концентрируюся на контракте Java bean, а не на ошибках во время выполнения. Просто добавьте охрану для специального случая добавления в конец списка, и вы настроены. – KDM

+0

Я вижу. Хорошо, я попытаюсь реализовать его сам. Также спасибо за ответ. – novice

 Смежные вопросы

  • Нет связанных вопросов^_^