Eventi sulle proprietà

 

Creare un oggetto che ha delle proprietà. Quando viene modificata una proprietà viene lanciato un evento che provoca la scrittura su terminale una serie di informazioni.

 

Questo programma poteva essere scritto facendo uso degli eventi perdsonalizzati (vedi qui) ma con le ultime versioni d java sono state introdotte delle classi specializzate alla gestione degli eventi provocati da u cambio di proprietà e sone:

  • java.beans.PropertyChangeEvent;
  • java.beans.PropertyChangeListener;
  • java.beans.PropertyChangeSupport;

La classe più interessante è la: java.beans.PropertyChangeSupport

 

Questa classe fa miracoli. Pensa a creare una Array listeners, creare l'evento, l'interfaccia, il metodo fire ed ha i metodi add per aggiugere i listener. Tutte cose che se usiamo gli eventi personalizzati avremmo dovuto scrivere noi.

Ora passiamoo a commentare il codice, iniziamo con la classe Person:

 

La classe person rappresenta l'oggetto che ha le proprietà che in seguito saranno sogette a modifica (sarebbe il source).

  1. Riga 12 istaziamo il supporto pcs. Qesto è dichiarato private, sarà perciò visibile solo all'interno di Person.
  2. Riga 14 il costruttore, che con i suoi due argomenti raccoglierà i primi dati (nome ed età della prima persona) e con essi inizializzera le variabili d'istanza (i campi)
  3. Dalla riga 21 alla riga 42 ci sono i metodi per scrivere e leggere le proprietà e leggere le variabili oldName e oldYear
  4. Dalla 44 alla 50 ci sono due metodi per aggiugere e rimuovere listener dalla lista di pcs. Per fare questo si utilizza il metodo add del pcs che ricordo è privato e quindi non accessibile all'esterno. Viene passato come argomento un listener che verrà aggiunto alla lista interna a pcs.
  5. Alla riga 52 Infine crea la classe MyPropertyChangeListener che implementa l'interfaccia PropertyChangeListener. Notare che questa interfaccia è stata dichiarata all'interno di pcs. In questa classe verrà sovrascritto il metodo propertyChange che eseguirà l'azione. Questo riceverà tramite il suo argomento l'evento PropertyChangeEvent. Anche quesot è stato creato all'interno di pcs e verrrà utilizzato per estrarre le informazioni necessarie ossia il nome dell'oggetto, il valore precedente della proprietà e il nuovo valore.

Classe: Person

 1 package personpcs;
 2 
 3 import java.beans.PropertyChangeEvent;
 4 import java.beans.PropertyChangeListener;
 5 import java.beans.PropertyChangeSupport;
 6 
 7 class Person {
 8     private String nome;
 9     private int eta;
10     private String oldNome;
11     private int oldEta; 
12     private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
13 
14     public Person(String nome, int eta) {
15         this.nome = nome;
16         this.eta = eta;
17         this.oldNome = nome;
18         this.oldEta = eta;
19     }
20 
21     public String getNome() {
22         return nome;
23     }
24     public void setNome(String nome) {
25         this.oldNome = this.nome;
26         this.nome = nome;
27         pcs.firePropertyChange("nome", oldNome, nome);      
28     }
29     public int getEta() {
30         return eta;
31     }
32     public void setEta(int eta) {
33         this.oldEta = this.eta;
34         this.eta = eta;
35         pcs.firePropertyChange("eta", oldEta, eta);
36     }
37     public String getOldNome() {
38         return oldNome;
39     }
40     public int getOldEta() {
41         return oldEta;
42     }
43     
44     public void addPropertyChangeListener(PropertyChangeListener listener) {
45         pcs.addPropertyChangeListener(listener);
46     }
47 
48     public void removePropertyChangeListener(PropertyChangeListener listener) {
49         pcs.removePropertyChangeListener(listener);
50     }
51 }
52 class MyPropertyChangeListener implements PropertyChangeListener {
53         @Override
54         public void propertyChange(PropertyChangeEvent evt) {
55             System.out.println("Ricevuto evento di modifica della proprietà: " 
56                     + evt.getPropertyName() + " da Person");
57             System.out.println("vecchio valore: " + evt.getOldValue());
58             System.out.println("nuovo valore: " + evt.getNewValue());
59         }
60     } 

 

Nel file PersonPcs.java si fanno le seguenti cose:

  1. Riga 7 si istanzia la classe Person e si crea l'oggetto person
  2. Riga 8 si istanzia la classe MyPropertyChangeListener e si crea l'oggetto listener
  3. Riga 10 si aggiunge alla lista dei listeners listener
  4. Righe 12 e 13 si modificano le proprietà nome ed età
  5. Segue la stampa a terminale dell'eta delle due persone

Classe: PersonPcs

 1 package personpcs;
 2 
 3 import java.beans.PropertyChangeListener;
 4 
 5 public class PersonPcs {
 6     public static void main(String[] args) {
 7         Person person = new Person("Silvano", 70);       
 8         PropertyChangeListener listener = new MyPropertyChangeListener();       
 9        
10         person.addPropertyChangeListener(listener);
11 
12         person.setNome("Andrea");
13         person.setEta(35);
14         
15          System.out.println(person.getOldNome() + " ha un'età di " 
16                  + person.getOldEta() + " anni");
17          System.out.println(person.getNome() + " ha un'età di " 
18                  + person.getEta() + " anni");                            
19