`

PropertyChangeSupport

    博客分类:
  • J2EE
阅读更多

package pcs;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public abstract class Element {
    PropertyChangeSupport listeners = new PropertyChangeSupport(this);

    protected void addPropertyChangeListener(PropertyChangeListener listener) {
        listeners.addPropertyChangeListener(listener);
    }

    protected void addPropertyChangeListener(String propertyName,PropertyChangeListener listener) {
        listeners.addPropertyChangeListener(propertyName,listener);
    }
    
    protected void removePropertyChangeListener(PropertyChangeListener listener) {
        listeners.removePropertyChangeListener(listener);
    }

    protected void firePropertyChange(String propertyName, Object oldValue,
            Object newValue) {
        listeners.firePropertyChange(propertyName, oldValue, newValue);
    }
    
    protected PropertyChangeSupport getPropertyChangeSupport(){
        return listeners;
    }
    
}

 

 

 

package pcs;

public class Node extends Element {
    private int id;
    private String name;
    private int age;
    private String address;
    

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        firePropertyChange("address",this.address,address);
        this.address = address;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
//        firePropertyChange("id",this.id,id);
        getPropertyChangeSupport().fireIndexedPropertyChange("id",1,this.id,id);
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (!name.equals(this.name)) {
            firePropertyChange("name", this.name, name);
        }
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

 

 

 

 

package pcs;

import java.beans.IndexedPropertyChangeEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class Client {
    public static void main(String[] args) {
        Node a = new Node();
        a.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                System.out.println("change-------------");
                System.out.println(evt.getClass().getName()
                        + "--  evt class name   ");
                System.out.println(evt.getPropertyName() + "  "
                        + evt.getOldValue() + "  " + evt.getNewValue());
                System.out.println(evt.getSource() + "--  source");
                System.out.println(evt.getPropagationId() + "--  id ");
                System.out.println("---------------");
                if (evt instanceof IndexedPropertyChangeEvent) {
                    System.out.println(((IndexedPropertyChangeEvent) evt).getIndex()+"   --------index");
                    
                }
            }

        });
        a.addPropertyChangeListener("name", new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                System.out.println("888888888888property name change88888888888888");
            }
        });
        a.addPropertyChangeListener("id", new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                System.out.println("888888888888property id change88888888888888");
            }
        });
        a.setId(222);
        a.setId(333);
        a.setAddress("bj");
        a.setAddress("sh");
//        a.setName("first");
//        a.setName("second");
    }
}

 

 

 PropertyChangeSupport是一个观察着模式的帮助类,

1.首先一般是写个基类设一个属性(字段)使用它,注意构造的时候必须传入自身。

然后设置addPropertyChangeListener,与remove的方法,这2个方法一般写到基类中,这样子类才可以实时的添加监听器,(也可以写个getPropertyChangeSupport方法, 然后让子类去添加listener,但一般没看人这样做过)。这一步主要是设置监听器。

2.然后发布事件, 用到的是firePropertyChange,fireIndexedPropertyChange  方法,第2个可以多设置一个index属性, 发布出去的是一个PropertyChangeEvent,IndexedPropertyChangeEvent是它的子类,所以用的时候要instanceof。这2个方法可以写到基类中让子类使用,也可以在基类中设置一个getListeners方法让子类获得PropertyChangeSupport,然后后自己去fire不同的方法,如 getPropertyChangeSupport().fireIndexedPropertyChange("id",1,this.id,id);   这一步是设置发布事件的方法

3.这一步才是真正的发布事件,在Bean 的set方法,或其他你想要的地方使用fire方法发布事件,注意fire的时候代码要在this.name = name; 之前,因为它会自动判断修改前后的值,写在this.name = name;之后的话因为this.name已经等于name,所以它不会真的发布事件,必须写在this.name = name;前面

4.最后一步是在客户代码中接受事件并执行相应的具体的监听器的逻辑,添加监听器的时候可以只监听具体的某一个字段

如 addPropertyChangeListener("name", new PropertyChangeListener(), 也可以监听全部addPropertyChangeListener(new PropertyChangeListener()

 

 

分享到:
评论

相关推荐

    使用PropertyChangeSupport监控变量

    在Java编程中,`PropertyChangeSupport` 是一个用于实现属性更改通知机制的工具类,它在JavaBeans规范中被广泛使用。这个类帮助开发者轻松地为对象添加属性变更监听器,以便在对象的属性发生变化时通知其他感兴趣的...

    详解java中的PropertyChangeSupport与PropertyChangeListener

    详解 Java 中的 PropertyChangeSupport 与 PropertyChangeListener Java 中的 PropertyChangeSupport 和 PropertyChangeListener 是 JavaBeans 规范中两个重要的类,它们用于实现属性变化的监听和通知。下面我们将...

    用js实现和Java中的PropertyChangeSupport类似的观察者模式

    闲着没事,突然想起Java的观察者模式中有一个PropertyChangeSupport与PropertyChangeListener,于是就想看看用js能不能也实现一个,毕竟有时候js写的东西也需要一个观察者模式,于是就写了点东西,应该能派上用场。

    PropertyChangeSupportApi:处理注释和使用 PropertyChangeSupport 所需的额外代码

    在Java编程中,`PropertyChangeSupport` 是一个用于事件通知的内置类,它主要用于实现JavaBeans组件中的属性改变事件监听。这个API使得对象能够向感兴趣的其他对象广播其属性的变化,从而实现了观察者模式。在本项目...

    PropertyChangeListener

    private PropertyChangeSupport changes = new PropertyChangeSupport(this); ``` - **添加/移除监听器**:提供公共方法允许外部对象添加或移除监听器。 ```java public void addPropertyChangeListener...

    DesignPatternJava

    "DesignPatternJava"这个主题着重于如何在Java环境中应用设计模式,特别是其中的"PropertyChangeSupport"部分,这是一个与事件处理相关的模式。 "PropertyChangeSupport"是JavaBeans组件模型的一部分,主要用来支持...

    JavaBean - Bound属性

    3. **添加PropertyChangeSupport对象**:在JavaBean类中,添加一个`java.beans.PropertyChangeSupport`对象作为成员变量,用于管理属性更改事件。例如`private PropertyChangeSupport pcs = new ...

    JavaBeans程序开发从入门到精通

    private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); public String getText() { return text; } public void setText(String newText) { String oldValue = text; ...

    jface数据绑定

    private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); public Person() {} public void addPropertyChangeListener(String propertyName, PropertyChangeListener ...

    第四章 GEF框架.doc

    private PropertyChangeSupport listeners = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener l) { listeners.addPropertyChangeListener(l); } // 省略...

    GEF 入门操作

    private PropertyChangeSupport listeners = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener l) { listeners.addPropertyChangeListener(l); } ...

    JavaBeans教程(范例入门

    `PropertyChangeSupport`类是JavaBeans框架中用于管理属性变更事件的关键组件。它负责维护事件监听器列表,并在属性变化时调用`firePropertyChange()`方法广播事件。在`alden3`类中,`changes`对象正是这样一个`...

    JavaBean 属性

    private PropertyChangeSupport changes = new PropertyChangeSupport(this); public void setString(String newString) { String oldString = this.ourString; this.ourString = newString; // 触发属性变化...

    《Java程序设计》模拟题带答案(B卷).docx

    `PropertyChangeSupport`类是用来实现属性更改通知的。正确答案是B,`PropertyChangeSupport()`。 6. 在Java中,`addPropertyChangeListener()`是用于添加属性改变监听器的方法,而`firePropertyChange()`则用来...

    JavaBeans教程.pdf

    - **PropertyChangeSupport**:在JavaBeans中,`PropertyChangeSupport`类用于管理`PropertyChangeEvent`。通过添加`PropertyChangeListener`,对象可以监听其他对象的属性变化。当Bound属性值改变时,`...

    第5章 JSP与JavaBean

    首先,声明并实例化一个PropertyChangeSupport对象,然后使用它的`firePropertyChange()`方法来触发属性改变事件。开发工具或手动编程时,可以通过`addPropertyChangeListener()`和`removePropertyChangeListener()`...

    设计模式:观察者模式java和javabean

    例如,开发者可以使用`java.beans.PropertyChangeSupport`类来管理属性变更的监听器,当某个属性值改变时,通过`firePropertyChange()`方法通知监听器。 在实际应用中,观察者模式广泛用于各种场景,如GUI组件之间...

    java.pdf格式

    private PropertyChangeSupport changes = new PropertyChangeSupport(this); public void setOurString(String newString) { String oldString = ourString; ourString = newString; changes....

    Swing下的MVC demo

    - 数据绑定:Swing支持双向数据绑定,模型和视图之间的数据可以通过特定机制自动同步,如`PropertyChangeSupport`和`BoundPropertySupport`。 通过学习和理解Swing下的MVC模式,开发者可以更好地组织代码,提高代码...

    jgoodies-binding-2_6

    3. **PropertyChangeSupport**:JGoodies Binding扩展了Java内置的`java.beans.PropertyChangeSupport`,提供了一种更加简洁的方式来处理属性更改事件。开发者可以通过调用`bindProperty()`方法轻松地建立绑定关系。...

Global site tag (gtag.js) - Google Analytics