`
ssxxjjii
  • 浏览: 950609 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Bean中使用PropertyChangeSupport支持PropertyChangeListeners

阅读更多

摘自 :http://zhangjunhd.blog.51cto.com/113473/36838

 

JavaBean的属性与一般Java程序中所指的属性,或者说与所有面向对象的程序设计语言中对象的属性是一个概念,在程序中的具体体现就是类中的变量。在JavaBean的设计中,按照属性的不同作用又细分为四类:单值属性;索引属性;关联属性;限制属性。
本文主要介绍如何使用PropertyChangeSupport类来支持关联属性事件的触发。
1.关联属性
关联属性,也称之为绑定属性。绑定属性会在属性值发生变化时,通知所有相关的监听器。为了实现一个绑定属性,必须实现两个机制。
1)  无论何时,只要属性的值发生变化,该bean必须发送一个PropertyChange事件给所有已注册的监听器。该变化可能发生在调用set方法时,或者程序的用户做出某种动作时。
2)  为了使感兴趣的监听器能够进行注册,bean必须实现以下两个方法:

void addPropertyChangeListener(PropertyChangeListener listener);
void removePropertyChangeListener(PropertyChangeListener listener);

 

2.使用PropertyChangeSupport管理监听器
可以通过java.bean包下的PropertyChangeSupport类来管理监听器。要使用这个类,bean必须有一个此类的数据域。

private PropertyChangeSupport changes = new PropertyChangeSupport(this);

 

这样就可以将添加和移除监听器的任务交给这个对象。

public void addPropertyChangeListener(PropertyChangeListener listener) {
    changes.addPropertyChangeListener(listener);
}
 
public void removePropertyChangeListener(PropertyChangeListener listener) {
    changes.removePropertyChangeListener(listener);
}

 当bean的属性发生变化时,使用PropertyChangeSupport对象的firePropertyChange方法,它会将一个事件发送给所有已经注册的监听器。该方法有三个参数:属性的名字、旧的值以及新的值。属性的值必须是对象,如果是简单数据类型,则必须进行包装。

changes.firePropertyChange("ourString", oldString, newString);

 所有注册的监听器实现PropertyChangeListener接口,该接口中只有一个方法。

public void propertyChange(PropertyChangeEvent e);

 当bean的属性值发生变化时,该方法中的代码就会被触发。可以通过

e.getOldValue();
e.getNewValue();

来得到changes.firePropertyChange("ourString", oldString, newString);中的oldString和newString。
3.为什么要使用PropertyChangeSupport
使用这个类管理监听器的好处是,它是线程安全的。如果使用一个循环体来set Bean的属性,则这个类可以保证所有监听器执行触发事件的有序。
还有一个好处是,这个类支持fire带索引的属性改变事件(详见java.bean.IndexedPropertyChangeEvent)。此时向注册的监听器发送一个PropertyChangeEvent的方法为:  

 

void fireIndexedPropertyChange(String PropertyName,int index,Object oldValue,Object newValue);

 4.示例
MyBoundBean类(具体代码见附件)是一个JavaBean,我们关注它的唯一一个属性ourString的变化情况,它的初始值是Hello。并通过PropertyChange类来管理监听器。注意在set方法中会调用firePropertyChange方法。
MyBoundBean.java

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
 
public class MyBoundBean {
    String ourString = "Hello";
 
    private PropertyChangeSupport changes = new PropertyChangeSupport(this);
 
    public void setString(String newString) {
       String oldString = ourString;
       ourString = newString;
       changes.firePropertyChange("ourString", oldString, newString);
    }
 
    public String getString() {
       return ourString;
    }
 
    public void addPropertyChangeListener(PropertyChangeListener listener) {
       changes.addPropertyChangeListener(listener);
    }
 
    public void removePropertyChangeListener(PropertyChangeListener listener) {
       changes.removePropertyChangeListener(listener);
    }
}

 

MyCallBound1类(具体代码见附件)是它的一个监听器。整个动作是这样的,点击jButton1或jButton2会触发Button的action事件,将jButton1的test设置为文本框中的内容,同时,目标bean的ourString属性的内容也会设置为文本框中的内容。

MyBoundBean b = new MyBoundBean();
…
public void actionPerformed(ActionEvent e) {
    jButton1.setText(textBox.getText());
    b.setString(textBox.getText());
}

 


目标bean的属性一改变(注意,初始值是"Hello"),将会触发propertyChange方法的执行。将文本框的内容设置为目标bean的ourString属性的旧值,同时,将jButton2的test设置成目标bean的ourString属性的新值。

public void propertyChange(PropertyChangeEvent e) {
    if (e.getSource() == b) {
       textBox.setText(e.getOldValue().toString());
       jButton2.setText(e.getNewValue().toString());
    }
}

 

如果不实现PropertyChangeListener接口的话,可以使用匿名内部类来达到同样的效果。(具体代码见附件MyCallBound2.java)

MyBoundBean b = new MyBoundBean();
…
b.addPropertyChangeListener(new PropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent e) {
       // 这样一来,我们就可以用自己定义的名字实现事件
       ourString_propertyChange(e);
    }
});

 

这样一来,我们就可以用自己定义的名字实现事件。

void ourString_propertyChange(PropertyChangeEvent e) {
    if (e.getSource() == b) {
       textBox.setText(e.getOldValue().toString());
       jButton2.setText(e.getNewValue().toString());
    }
}

 

分享到:
评论

相关推荐

    使用PropertyChangeSupport监控变量

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

    java bean实例

    总之,Java Bean是一种遵循特定规范的Java类,用于封装数据和业务逻辑,它们在企业级应用中广泛使用。提供的压缩包可能包含了一个具备数据库操作功能的Java Bean实例,可以通过配置文件和依赖注入来管理和使用。如果...

    详解java中的PropertyChangeSupport与PropertyChangeListener

    我们使用 PropertyChangeSupport 类来管理该属性的变化,然后在 setter 方法中使用 firePropertyChange 方法来通知监听器。 在客户端代码中,我们创建了一个 TestBean 实例,然后添加了两个监听器 ...

    JAVA Bean 课程.rar_Java bean

    在Java世界里,Java Bean是遵循特定设计规范的Java类,这些规范使得这些类易于被其他Java应用程序或者框架使用,尤其是在Java Enterprise Edition(Java EE)环境中。它们通常代表业务逻辑或数据实体,并且可以通过...

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

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

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

    在"PropertyChangeSupportApi-master"这个项目中,我们可以预期看到一个示例实现,展示如何在自定义类中使用 `PropertyChangeSupport` 来处理属性变化事件,以及如何添加和管理相关的注释。通过分析这个项目的源代码...

    使用jsp和java.bean来构建一个网上书店

    通过`<error-page>`标签在web.xml配置文件中定义错误处理页面,以及在JSP中使用`try-catch-finally`块捕获和处理异常。 **7. 用户认证与授权** 可以使用session和cookie实现简单的登录验证,或者集成更复杂的认证...

    JavaBean技术(jsp).rar

    2. **在JSP中使用JavaBean**:展示如何在JSP页面中实例化和操作JavaBean,以及如何传递数据到Bean和从Bean获取数据。 3. **作用域的理解**:讲解page、request、session和application四个不同的JSP作用域,以及在...

    PropertyChangeSupportPlugin:使用字节码编织为带注释的 bean 添加 PropertyChangeListener 支持的 Maven 插件

    在这个插件中,注解被用来标记哪些类需要添加 `PropertyChangeListener` 支持。 6. **`PropertyChangeEvent`**:这是一个 Java Beans 的事件类,表示一个对象的属性值发生了变化。事件源是发生变化的对象,事件参数...

    Exercise_203_java_bean

    对于大量的表单字段,你可能需要考虑使用一些设计模式来保持代码的整洁和可维护性,比如使用`Map`存储属性,或者创建一个通用的`FormField`类,然后在Bean中使用一个`List<FormField>`来表示所有表单字段。...

    DesignPatternJava

    通过理解并正确使用"PropertyChangeSupport",开发者可以在Java应用程序中实现更加灵活和健壮的组件交互,使得系统更易于扩展和维护。设计模式,如观察者模式,是软件工程中不可或缺的一部分,它们为解决复杂问题...

    javabean 的用法

    3. **符合 JavaBeans 规范**:JavaBean 应遵循 JavaBeans 标准,例如使用 `java.beans` 包中的 `PropertyChangeSupport` 类来支持属性改变事件。 4. **序列化**:JavaBean 往往需要实现 `Serializable` 接口,以...

    java-2-exercise-15.33:创建一个动画bean机器

    在动画Bean机器中,可能需要使用这些API来绘制每一帧的动画效果。 **5. 设计模式**:在实现动画Bean机器时,可能会用到设计模式,如观察者模式(Observer Pattern)来处理事件和状态变更,工厂模式(Factory ...

    PropertyChangeListener

    - **创建实例**:首先,需要在 JavaBean 中声明一个 `PropertyChangeSupport` 实例,通常将其初始化为当前 JavaBean 的引用。 ```java private PropertyChangeSupport changes = new PropertyChangeSupport(this...

    javaBean复习材料

    "学员总结复习本门课程模板V1.0.ppt"则可能是一个详细的复习指南,涵盖了JavaBean的主要概念、最佳实践、常见应用场景,比如在Servlet、JSP、EJB或者Spring框架中的使用。可能还包括如何序列化JavaBean,以便于在...

    JavaBeans程序开发从入门到精通

    5. **使用IDE**:熟练使用集成开发环境(IDE)中的JavaBeans支持,如Eclipse的Visual Editor或NetBeans的Matisse,这能提高开发效率。 6. **BeanInfo类**:虽然不是必需的,但理解BeanInfo类的作用可以帮助自定义...

    jface数据绑定

    在这个`Person`类中,我们实现了`PropertyChangeListener`接口,并且添加了一个`PropertyChangeSupport`实例,以便于管理属性变更监听器。这样做的目的是为了让该类能够支持属性变更事件的发布与监听,从而实现数据...

    java 获取修改JavaBeans中的内容

    在Web应用程序开发中,JavaBeans经常被用来封装数据和业务逻辑,便于在JSP(JavaServer Pages)或其他Java应用中使用。本篇文章将深入探讨如何在Java中获取和修改JavaBeans中的内容。 首先,理解JavaBeans的基本...

    《Java程序设计》(B卷).docx

    `PropertyChangeSupport`是Java中用于支持属性改变事件的类。 9. **Java Application的生命周期方法**:`main`是应用的起点,`toString()`返回对象的字符串表示,`init()`在Applet或Servlet初始化时调用。 10. **...

    javaBean协议

    JavaBean协议是Java编程语言中的一种规范,它定义了如何创建可重用的Java组件,这些组件可以在各种软件开发环境中被方便地使用和交互。JavaBean主要遵循以下几点原则: 1. **公共构造器**:JavaBean应提供一个无参...

Global site tag (gtag.js) - Google Analytics