16 Eylül 2019 Pazartesi

Swing SwingPropertyChangeSupport Sınıfı

Giriş
SwingPropertyChangeSupport kendi içinde bir tane HashMap içerir ve PropertyChangeListener nesnelerini bu map'e ekler.

Aslında HashMap içermesinin bir anlamı yok çünkü kod içinde map'e ekleme yaparken key = null value = Array<PropertyChangeListener> gibi kullanılıyor. Yani aynı PropertyChangeListener kaç defa eklenirse o kadar defa çağrılır. Buradan da güzel memory leak çıkar :)

addPropertyChangeListener metodu
Elimizde şöyle bir sınıf olsun.
public class MyImplementationOfModel implements Model{
  ...
  private SwingPropertyChangeSupport propChangeFirer;
  private String address;
  private String firstName;
  private String lastName;

  public MyImplementationOfModel() {
    propChangeFirer = new SwingPropertyChangeSupport(this);
  }
  public void addListener(PropertyChangeListener prop) {
    propChangeFirer.addPropertyChangeListener(prop);
  }
  public void setAddress(String address){
    String oldVal = this.address;
    this.address = address;

    propChangeFirer.firePropertyChange("address", oldVal, address);
  }
  ...
  //some other setters for other properties & code for database interaction
  ...
}
Dinleyen tarafta şöyle yaparız.
public class MyImplementationOfController implements PropertyChangeListener {
  
  private Model model;

  public MyImplementationOfController(Model model){
    this.model = model;

    //register the controller as the listener of the model
    this.model.addListener(this);
    
  }

  
  public void propertyChange(PropertyChangeEvent evt){
    String propName = evt.getPropertyName();
    Object newVal = evt.getNewValue();

    if("address".equalsIgnoreCase(propName)){
      view.getTxtAddress().setText((String)newVal);
    }
    //else  if property (name) that fired the change event is first name property
    //else  if property (name) that fired the change event is last name property
  }
}

Hiç yorum yok:

Yorum Gönder