PropertyChangeListener Java


J'apprends actuellement à utiliser la classe PropertyChangeListener et PropertyChangeSupport. Je suis un peu coincé dans la partie où l'auditeur reçoit l'événement, j'aurai donc besoin d'aide pour cette partie.

Dans mon programme il y a 2 classes:

  • Un, le contrôleur, implémente le PropertyChangeListener
  • L'autre, le modèle, implémente le propertyChanegSupport

Contrôleur:

    public class Controlador implements PropertyChangeListener {
        private ControlAccesos modelo;
        private GUIpanel vistaPan;
        private GUIsenal vistaSen;


     public Controlador(GUIpanel vista1, GUIsenal vista2, ControlAccesos model){

        modelo=model;
        vistaPan = vista1;
        vistaSen = vista2;

        modelo.addPropertyChangeListener(this);

     }


     public void propertyChange(PropertyChangeEvent evt) {
        System.out.print("Resultado");
        if (evt.getPropertyName().equals("mensaje")){
            vistaPan.refrescaMensaje((String)evt.getNewValue());
        }

     }
}

Modèle:

/**
 * Clase principal del sistema de control de accesos a la facultad.
 */
public class ControlAccesos
{

    /**
     * Mesaje shown in the GUI
     */
    private String mensaje;
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
     .
     .
     .
    public void TarjetaDetectada( String usuario )
    {
        state.TarjetaDetectada(this, usuario);
        changeSupport.firePropertyChange("mensaje",this.mensaje,this.mensaje);
    }

    public void addPropertyChangeListener( PropertyChangeListener listener ){

        changeSupport.addPropertyChangeListener(listener);
    }

Le problème est que le code n'atteint jamais la fonction propertyChange ("Resultado" n'est jamais imprimé à l'écran).

Merci d'avance.

Author: Setekorrales, 2017-03-13

1 answers

De la documentation pour PropertyChangeSupport.firePropertyChange : "Aucun événement n'est déclenché si les anciennes et les nouvelles valeurs sont égales et non nulles."Cela a du sens, car il n'y a aucune raison de déclencher un événement si la valeur n'a pas réellement changé.

Les propriétés de Bean sont représentées par des méthodes get (ou, si le type d'une propriété est un booléen primitif, une méthode is). Les propriétés inscriptibles ont également une méthode set correspondante. Normalement, vous appelleriez firePropertyChange à partir d'une telle méthode set, dans laquelle cas où vous auriez à la fois une ancienne valeur et une nouvelle valeur:

public String getMensaje() {
    return mensaje;
}

public void setMensaje(String mensaje) {
    String old = this.mensaje;
    this.mensaje = mensaje;
    changeSupport.firePropertyChange("mensaje", old, this.mensaje);
}
 1
Author: VGR, 2017-03-13 19:04:15