Cette fois, je voudrais expliquer comment détecter qu'une propriété a été modifiée en utilisant l'API Java standard PropertyChangeListener
.
Le processus de détection des événements est bien connu dans SWT, Swing et AWT, qui sont des applications d'interface graphique Java, mais même les classes Java ordinaires ont un mécanisme pour détecter les événements dont les propriétés ont changé.
Item.java
package com.example.demo;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class Item {
private int price;
//★ Point 1
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
//★ Point 2
public void addPropertyChangeListener(PropertyChangeListener listener) {
this.pcs.addPropertyChangeListener(listener);
}
//★ Point 3
public void removePropertyChangeListener(PropertyChangeListener listener) {
this.pcs.removePropertyChangeListener(listener);
}
public int getPrice() {
return price;
}
//★ Point 4
public void setPrice(int price) {
int oldPrice = this.price;
this.price = price;
this.pcs.firePropertyChange("price", oldPrice, price);
}
// generated by eclipse
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Item [price=");
builder.append(price);
builder.append("]");
return builder.toString();
}
}
** ★ Point 1 **
Créez une instance de java.beans.PropertyChangeSupport
et définissez-la comme un champ.
L'argument constructeur de «PropertyChangeSupport» spécifie «this» car c'est l'objet à partir duquel l'événement est né (détecté).
** ★ Point 2 **
Implémentez la méthode pour ajouter java.beans.PropertyChangeListener
au PropertyChangeSupport
défini dans ★ Point 1.
** ★ Point 3 **
Implémentez une méthode qui supprime java.beans.PropertyChangeListener
de PropertyChangeSupport
.
Veuillez penser que ★ Point 2 et ★ Point 3 sont les éléments habituels à implémenter en tant qu'ensemble.
** ★ Point 4 **
Déclenchez un événement de changement de propriété avec la méthode firePropertyChange
de PropertyChangeSupport
.
Person.java
package com.example.demo;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class Person {
private String name;
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public void addPropertyChangeListener(PropertyChangeListener listener) {
this.pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
this.pcs.removePropertyChangeListener(listener);
}
public String getName() {
return name;
}
public void setName(String name) {
String oldName = this.name;
this.name = name;
this.pcs.firePropertyChange("name", oldName, name);
}
// generated by eclipse
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Person [name=");
builder.append(name);
builder.append("]");
return builder.toString();
}
}
DemoListener.java
package com.example.demo;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
//★ Point 5
public class DemoListener implements PropertyChangeListener {
//★ Point 6
@Override
public void propertyChange(PropertyChangeEvent evt) {
//★ Point 7
Object eventTriggerObject = evt.getSource();
String propertyName = evt.getPropertyName();
//★ Point 8
if (Item.class.isInstance(eventTriggerObject)) {
if ("price".equals(propertyName)) {
//★ Point 9
Integer oldValue = (Integer) evt.getOldValue();
Integer newValue = (Integer) evt.getNewValue();
System.out.println("[Item.price] oldValue:" + oldValue + " -> newValue:" + newValue);
}
} else if (Person.class.isInstance(eventTriggerObject)) {
if ("name".equals(propertyName)) {
String oldValue = (String) evt.getOldValue();
String newValue = (String) evt.getNewValue();
System.out.println("[Person.name] oldValue:" + oldValue + " -> newValue:" + newValue);
}
}
}
}
** ★ Point 5 **
Définit une classe qui implémente l'interface java.beans.PropertyChangeListener
.
** ★ Point 6 **
Implémentez le processus de gestion des événements de changement de propriété en remplaçant la méthode propertyChange
.
** ★ Point 7 **
Récupérez l'objet à partir duquel l'événement de modification est né avec la méthode getSource ()
de java.beans.PropertyChangeEvent
.
En outre, la propriété modifiée peut être spécifiée à l'aide de la méthode getPropertyName ()
car le nom de la propriété peut être obtenu.
** ★ Point 8 **
Cette fois, les écouteurs sont enregistrés à la fois dans la classe ʻItem et dans la classe
Person`, il est donc nécessaire de déterminer quelle instance est la source.
** ★ Point 9 **
La valeur avant le changement de propriété est obtenue par la méthode getOldValue ()
, et la valeur après la modification est obtenue par la méthode getNewValue ()
.
La valeur de retour est ʻObject`, vous devez donc la convertir en fonction du type de données de la propriété.
App.java
package com.example.demo;
public class App {
public static void main(String[] args) {
Item item = new Item();
System.out.println(item);
item.setPrice(500);
System.out.println(item);
DemoListener demoListener = new DemoListener();
item.addPropertyChangeListener(demoListener);
item.setPrice(700);
item.setPrice(1000);
Person person = new Person();
System.out.println(person);
person.setName("Taro");
System.out.println(person);
person.addPropertyChangeListener(demoListener);
person.setName("5zm");
person.setName("Yamada");
item.removePropertyChangeListener(demoListener);
person.removePropertyChangeListener(demoListener);
}
}
Item [price=0]
Item [price=500]
[Item.price] oldValue:500 -> newValue:700
[Item.price] oldValue:700 -> newValue:1000
Person [name=null]
Person [name=Taro]
[Person.name] oldValue:Taro -> newValue:5zm
[Person.name] oldValue:5zm -> newValue:Yamada
Avant d'ajouter un écouteur avec ʻaddPropertyChangeListener, définir une valeur avec
setter` ne fait rien, et après avoir ajouté un écouteur, vous pouvez voir que le contenu modifié est détecté par l'écouteur.
Cette fois, j'ai expliqué comment détecter qu'une propriété a été modifiée en utilisant l'API Java standard PropertyChangeListener
.
En utilisant PropertyChangeListener
, vous pouvez facilement essayer le traitement des événements sans préparer de bibliothèque spéciale.