java.beans.PropertyChangeSupport通过注册PropertyChangeListener可以令属性在运行或者设计时被修改后,可以自动地通知外部世界。

java.beans.VetoableChangeSupport通过注册VetoableChangeListener有能力拒绝被设置为某个数值的属性。如果fireVetoableChange方法抛出了一个PropertyVetoException例外,就表明监听者已经拒绝了属性的改变,属性改变将不会生效。

例子很简单,看看就会明白,不多写解释了,看例子吧!

 

一个Bean类

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;


public class SomeBean
{
    
protected PropertyChangeSupport propertySupport; //属性改变通知支持
    protected VetoableChangeSupport vetoableChangeSupport; //反对属性改变支持
    private String changableValue;


    
public SomeBean()
    
{
        propertySupport 
= new PropertyChangeSupport(this);//使本对象有属性改变通知监听器的能力
        vetoableChangeSupport = new VetoableChangeSupport(this);////使监听器有反对本对象属性改变的能力
        
//这里添加支持与象使用observer模式的实现接有口异曲同工之效
    }



    
public void setChangableValue(String newValue) throws PropertyVetoException
    
{
        String oldValue;
        
if((null == changableValue) || !changableValue.equals(newValue))
        
{
            oldValue 
= changableValue;
            changableValue 
= newValue;
            vetoableChangeSupport.fireVetoableChange(
"changableValue", oldValue, newValue);//这个在前
            propertySupport.firePropertyChange("changableValue", oldValue, newValue);//这个在后
            
//如果两个监听器的次序调过来,你想想会有什么问题?你期待的效果没有达到哦~~~~~~~~~~~~~~~
        }

    }



    
public void addPropertyChangeListener(PropertyChangeListener listener)
    
{
        propertySupport.addPropertyChangeListener(listener);
    }



    
public void removePropertyChangeListener(PropertyChangeListener listener)
    
{
        propertySupport.removePropertyChangeListener(listener);
    }



    
public void addVetoableChangeListener(VetoableChangeListener listener)
    
{
        vetoableChangeSupport.addVetoableChangeListener(listener);
    }



    
public void removeVetoableChangeListener(VetoableChangeListener listener)
    
{
        vetoableChangeSupport.removeVetoableChangeListener(listener);

    }



    
public String getChangableValue()
    
{
        
return changableValue;
    }


}

 

一个监听器(这里为了方便,把两种监听职能写在一个类中)

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;


public class SomeBeanPropertyListener implements PropertyChangeListener,VetoableChangeListener
{
    
public void propertyChange(PropertyChangeEvent evt)
    
{
        System.out.println(
"\""+evt.getNewValue() +"\" is setted to replace the old value \""+evt.getOldValue()+"\"");
    }


    
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException
    
{
        
if(evt.getNewValue().equals("invalidValue")){
            System.out.println(
"\""+evt.getNewValue() +"\" is try to replace the old value \""+evt.getOldValue()+"\"");
            
throw new PropertyVetoException("What you set \"invalidValue\"is a invalid value! operate fail!", evt);
        }

    }

}

 

测试一下

public class Test
{
    
public static void main(String[] args)
    
{
        SomeBean someBean 
= new SomeBean();
        someBean.addPropertyChangeListener(
new SomeBeanPropertyListener());
        someBean.addVetoableChangeListener(
new SomeBeanPropertyListener());
        
try
        
{
            someBean.setChangableValue(
"someValue");
            someBean.setChangableValue(
"anotherValue");
            someBean.setChangableValue(
"invalidValue");
        }

        
catch(PropertyVetoException e)
        
{
            System.err.println(e.getMessage());
        }

    }

}

 

结果输出:

"someValue" is setted to replace the old value "null"
"anotherValue" is setted to replace the old value "someValue"
"invalidValue" is try to replace the old value "anotherValue"
What you set 
"invalidValue"is a invalid value! operate fail!