Dieses Mal möchte ich erklären, wie mithilfe der Standard-Java-API "PropertyChangeListener" festgestellt werden kann, dass eine Eigenschaft geändert wurde.
Das Erkennen von Ereignissen ist in SWT, Swing und AWT bekannt, bei denen es sich um Java-GUI-Apps handelt. Selbst gewöhnliche Java-Klassen verfügen jedoch über einen Mechanismus zum Erkennen von Ereignissen, deren Eigenschaften sich geändert haben.
Item.java
package com.example.demo;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class Item {
private int price;
//★ Punkt 1
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
//★ Punkt 2
public void addPropertyChangeListener(PropertyChangeListener listener) {
this.pcs.addPropertyChangeListener(listener);
}
//★ Punkt 3
public void removePropertyChangeListener(PropertyChangeListener listener) {
this.pcs.removePropertyChangeListener(listener);
}
public int getPrice() {
return price;
}
//★ Punkt 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();
}
}
** ★ Punkt 1 ** Erstellen Sie eine Instanz von "java.beans.PropertyChangeSupport" und definieren Sie sie als Feld. Das Konstruktorargument von "PropertyChangeSupport" gibt "this" an, da es das Objekt ist, von dem das Ereignis stammt (erkannt wurde).
** ★ Punkt 2 **
Implementieren Sie die Methode, um java.beans.PropertyChangeListener
zu dem in ★ Punkt 1 definierten PropertyChangeSupport
hinzuzufügen.
** ★ Punkt 3 **
Implementieren Sie eine Methode, die java.beans.PropertyChangeListener
aus PropertyChangeSupport
entfernt.
Bitte denken Sie daran, dass ★ Punkt 2 und ★ Punkt 3 die üblichen Dinge sind, die als Set implementiert werden müssen.
** ★ Punkt 4 **
Lösen Sie ein Eigenschaftsänderungsereignis mit der Methode firePropertyChange
von PropertyChangeSupport
aus.
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;
//★ Punkt 5
public class DemoListener implements PropertyChangeListener {
//★ Punkt 6
@Override
public void propertyChange(PropertyChangeEvent evt) {
//★ Punkt 7
Object eventTriggerObject = evt.getSource();
String propertyName = evt.getPropertyName();
//★ Punkt 8
if (Item.class.isInstance(eventTriggerObject)) {
if ("price".equals(propertyName)) {
//★ Punkt 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);
}
}
}
}
** ★ Punkt 5 **
Definiert eine Klasse, die die Schnittstelle java.beans.PropertyChangeListener
implementiert.
** ★ Punkt 6 ** Implementieren Sie den Prozess der Behandlung von Eigenschaftsänderungsereignissen, indem Sie die Methode "propertyChange" überschreiben.
** ★ Punkt 7 ** Rufen Sie das Objekt ab, von dem das Änderungsereignis mit der Methode getSource () von java.beans.PropertyChangeEvent stammt. Die geänderte Eigenschaft kann auch mithilfe der Methode "getPropertyName ()" angegeben werden, da der Eigenschaftsname abgerufen werden kann.
** ★ Punkt 8 ** Da Listener diesmal in der Klasse "Item" und der Klasse "Person" registriert sind, muss ermittelt werden, welche Instanz die Quelle ist.
** ★ Punkt 9 ** Der Wert vor der Eigenschaftsänderung wird von der Methode "getOldValue ()" und der Wert nach der Änderung von der Methode "getNewValue ()" abgerufen. Der Rückgabewert ist "Objekt", daher müssen Sie ihn entsprechend dem Datentyp der Eigenschaft umwandeln.
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
Bevor Sie einen Listener mit addPropertyChangeListener
hinzufügen, bewirkt das Festlegen eines Werts mit setter
nichts. Nach dem Hinzufügen eines Listeners können Sie sehen, dass der geänderte Inhalt vom Listener erkannt wird.
Dieses Mal habe ich erklärt, wie mithilfe der Standard-Java-API "PropertyChangeListener" festgestellt werden kann, dass eine Eigenschaft geändert wurde. Mit PropertyChangeListener können Sie die Ereignisverarbeitung ganz einfach ausprobieren, ohne eine spezielle Bibliothek vorzubereiten.