2015-08-06 4 views
1

Je travaille actuellement avec PropertyChangeListeners et je veux savoir s'il est conseillé de déclencher un changement de propriété à chaque fois qu'un objet est ajouté (ou supprimé, d'ailleurs) à une propriété indexée comme une ArrayList.Ajout d'un élément à une propriété indexée - 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); 
    } 

} 

Je lisais les tutoriels PropertyChangeListener et il semblait qu'il convenait de tirer un changement de propriété chaque fois changé la valeur d'une propriété liée. Eh bien, je ne savais pas si cela signifiait que je devrais déclencher un changement de propriété chaque fois qu'une propriété a été modifiée par signifie ou seulement lorsque la propriété (ou un élément de cette propriété) a été strictement définie/réaffectée à une valeur différente .

Dans mon programme, il serait très pratique si plusieurs classes pouvaient changer à chaque fois qu'un élément est supprimé ou ajouté à la matrice ArrayList, et j'ai pensé qu'un PropertyChangeListener pourrait m'aider à cet égard. Veuillez me faire savoir si cette méthode est déconseillée et s'il y a une autre façon que les autres classes peuvent écouter et répondre à la suppression/ajout aux propriétés indexées.

+1

En regardant le contrat, vous devez envoyer des «tapis» avant modification et des «tapis» après modification. Je doute que ce soit ce que tu veux. Vous pouvez utiliser 'fireIndexedPropertyChange' plutôt. – KDM

+0

D'accord, mais si j'essaie fireIndexedPropertyChange, 'pcs.fireIndexedPropertyChange (" mat ", mats.size(), null, m)' est-il un remplacement approprié? Étant donné que tout ce que j'ai appris sur la modification des propriétés liées concerne l'affectation d'une propriété à quelque chose de différent plutôt que l'ajout ou la suppression d'une propriété, j'ai du mal à paramétrer cette méthode. @KDM – novice

Répondre

1

Voir l'exemple suivant:

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

} 

qui implémente les propertyChange ainsi que indexedPropertyChange pour mats.

+0

Dans votre méthode 'setMat', si' index' = 'mats.size()', alors 'mats.remove (index)' ne provoquerait-il pas 'ArrayIndexOutOfBoundsException'? Non seulement cela, puisque 'existing' serait défini sur' null', alors 'existing.equals (mat)' ne provoquerait-il pas 'NullPointerException'? @KDM – novice

+1

Je me concentre davantage sur le contrat du bean Java, plutôt que sur les erreurs d'exécution. Il suffit d'ajouter la garde pour le cas particulier d'ajouter à la fin de la liste et vous êtes défini. – KDM

+0

Je vois. Eh bien, je vais essayer de l'implémenter moi-même. Aussi, merci pour la réponse. – novice