源组件(bean)的属性改变监听PropertyChangeListener

源组件有属性,属性改变了,就会触发PropertyChangeListener监听。
源组件(bean)绑定(bound)一个属性,属性改变,就监听得到。一般用界面UI监听模型的属性变化。

源组件(button)、绑定属性(background)、事件(PropertyChangeEvent)、监听器(PropertyChangeListener)。
事件(PropertyChangeEvent):getPropertyName()、getNewValue()。getOldValue()。
监听器(PropertyChangeListener):public void propertyChange(PropertyChangeEvent propertyChangeEvent)。

设计源组件:
源组件中有成员,即工具类PropertyChangeSupport,它可以注册或删除监听器、它可以调用事件触发方法。
工具类PropertyChangeSupport中触发事件firePropertyChange(prop, oldValue, newValue)方法。
prop属性字符串、oldValue属性的旧值、newValue属性的新值。

 

例子1:

package Listener;

import java.beans.PropertyChangeEvent;   //事件
import java.beans.PropertyChangeListener; //监听
import java.beans.PropertyChangeSupport;  //支持

/**
 *
 * @author maxin
 */
public class PropertyBean {   //源组件(bean)

    private String demoName;

    //这是一个实用工具类,支持绑定 (bound) 属性的 bean 可以使用该类。
    //可以使用此类的实例作为 bean 的成员字段,并将各种工作委托给它。
    PropertyChangeSupport listeners = new PropertyChangeSupport(this);

    public PropertyBean() {
        demoName = "initValue";
    }


    public String getDemoName() {
        return demoName;
    }


    public void setDemoName(String demoName) {
        String oldValue = this.demoName;
        this.demoName = demoName;
        //发布监听事件
        firePropertyChange("demoName", oldValue, demoName);

    }
    // 本地方法
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        listeners.addPropertyChangeListener(listener);  //  系统方法
    }

    public void removePropertyChangeListener(PropertyChangeListener listener){
        listeners.removePropertyChangeListener(listener);   //  系统方法
    }


    /**
     * 触发属性改变的事件
     */
    protected void firePropertyChange(String prop, Object oldValue, Object newValue) {
        listeners.firePropertyChange(prop, oldValue, newValue);   //  系统方法
    }

public static void main(String[] args) {
        PropertyBean beans = new PropertyBean();
        beans.addPropertyChangeListener(new PropertyChangeListener(){

            public void propertyChange(PropertyChangeEvent evt) {
                System.out.println("OldValue:"+evt.getOldValue());
                System.out.println("NewValue:"+evt.getNewValue());
                System.out.println("tPropertyName:"+evt.getPropertyName());
            }});
        beans.setDemoName("test");
    }

}

 

例子2

package Listener;
//属性监听


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class BoundSample {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Button Sample");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final JButton button1 = new JButton("Select Me");
    final JButton button2 = new JButton("No Select Me");

    ActionListener actionListener = new ActionListener() {
      public void actionPerformed(ActionEvent actionEvent) {
        JButton button = (JButton) actionEvent.getSource();
        int red = (int) (Math.random() * 255);
        int green = (int) (Math.random() * 255);
        int blue = (int) (Math.random() * 255);
        button.setBackground(new Color(red, green, blue));
      }
    };

    PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
      public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
        String property = propertyChangeEvent.getPropertyName();   //得到属性名
        if ("background".equals(property)) {
          button2.setBackground((Color) propertyChangeEvent
              .getNewValue());  //得到属性值
        }
      }
    };

    button1.addActionListener(actionListener);
    button1.addPropertyChangeListener(propertyChangeListener);
    button2.addActionListener(actionListener);

    Container contentPane = frame.getContentPane();
    contentPane.add(button1, BorderLayout.NORTH);
    contentPane.add(button2, BorderLayout.SOUTH);
    frame.setSize(300, 100);
    frame.setVisible(true);
  }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值