Java PropertyChangeListener erkennt Eigenschaftsänderungen

1. Zuallererst

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.

2. Implementierung

2.1 Zu prüfende Klassen

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();
    }
}

2.2 Klasse, die Änderungen erkennt

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.

2.3. Funktionsprüfung der Demo-App-Klasse

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);
    }
}

3. Ausführungsergebnis

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.

4. Schließlich

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.

Recommended Posts

Java PropertyChangeListener erkennt Eigenschaftsänderungen
Änderungen in Java 11
Änderungen von Java 8 zu Java 11
Java-Versionsnotation, die sich in Java 10 ändert