隨筆-35  評(píng)論-97  文章-0  trackbacks-0

          java.beans.PropertyChangeSupport通過注冊PropertyChangeListener可以令屬性在運(yùn)行或者設(shè)計(jì)時(shí)被修改后,可以自動(dòng)地通知外部世界。

          java.beans.VetoableChangeSupport通過注冊VetoableChangeListener有能力拒絕被設(shè)置為某個(gè)數(shù)值的屬性。如果fireVetoableChange方法拋出了一個(gè)PropertyVetoException例外,就表明監(jiān)聽者已經(jīng)拒絕了屬性的改變,屬性改變將不會(huì)生效。

          例子很簡單,看看就會(huì)明白,不多寫解釋了,看例子吧!

           

          一個(gè)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; //反對(duì)屬性改變支持
              private String changableValue;


              
          public SomeBean()
              
          {
                  propertySupport 
          = new PropertyChangeSupport(this);//使本對(duì)象有屬性改變通知監(jiān)聽器的能力
                  vetoableChangeSupport = new VetoableChangeSupport(this);////使監(jiān)聽器有反對(duì)本對(duì)象屬性改變的能力
                  
          //這里添加支持與象使用observer模式的實(shí)現(xiàn)接有口異曲同工之效
              }



              
          public void setChangableValue(String newValue) throws PropertyVetoException
              
          {
                  String oldValue;
                  
          if((null == changableValue) || !changableValue.equals(newValue))
                  
          {
                      oldValue 
          = changableValue;
                      changableValue 
          = newValue;
                      vetoableChangeSupport.fireVetoableChange(
          "changableValue", oldValue, newValue);//這個(gè)在前
                      propertySupport.firePropertyChange("changableValue", oldValue, newValue);//這個(gè)在后
                      
          //如果兩個(gè)監(jiān)聽器的次序調(diào)過來,你想想會(huì)有什么問題?你期待的效果沒有達(dá)到哦~~~~~~~~~~~~~~~
                  }

              }



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


          }

           

          一個(gè)監(jiān)聽器(這里為了方便,把兩種監(jiān)聽職能寫在一個(gè)類中)

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

              }

          }

           

          結(jié)果輸出:

          "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!
          posted on 2007-06-05 16:24 三告習(xí)習(xí) 閱讀(1519) 評(píng)論(2)  編輯  收藏 所屬分類: java/jdk

          評(píng)論:
          # re: [java 拾遺篇] JavaBean實(shí)現(xiàn)約束屬性簡單例 2007-06-05 16:40 | itge.ge
          JavaBean監(jiān)聽器!例子很簡潔,思路很好!  回復(fù)  更多評(píng)論
            
          # re: [java 拾遺篇] JavaBean實(shí)現(xiàn)約束屬性簡單例 2007-06-05 16:53 | 三告習(xí)習(xí)
          例子寫得太繁雜,會(huì)讓不熟悉的新手看到摸不著頭。
          喜歡將例子簡化,這樣也可以讓自己的思路清晰,要擴(kuò)展也是挺方便的  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 高雄市| 安吉县| 汾阳市| 贵溪市| 泾阳县| 泌阳县| 大关县| 大宁县| 土默特右旗| 门头沟区| 南雄市| 惠水县| 加查县| 拜城县| 定结县| 井研县| 岳西县| 即墨市| 河西区| 堆龙德庆县| 曲阜市| 高邮市| 灵宝市| 吉安市| 镇巴县| 阳西县| 布尔津县| 西峡县| 彩票| 建阳市| 翼城县| 田东县| 麻阳| 泰安市| 广宁县| 平昌县| 喀喇沁旗| 临沧市| 青神县| 瑞丽市| 新宾|