隨筆-35  評論-97  文章-0  trackbacks-0

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

          評論:
          # re: [java 拾遺篇] JavaBean實現約束屬性簡單例 2007-06-05 16:40 | itge.ge
          JavaBean監聽器!例子很簡潔,思路很好!  回復  更多評論
            
          # re: [java 拾遺篇] JavaBean實現約束屬性簡單例 2007-06-05 16:53 | 三告習習
          例子寫得太繁雜,會讓不熟悉的新手看到摸不著頭。
          喜歡將例子簡化,這樣也可以讓自己的思路清晰,要擴展也是挺方便的  回復  更多評論
            
          主站蜘蛛池模板: 金昌市| 黑水县| 日喀则市| 峨边| 施秉县| 收藏| 安阳市| 蓝山县| 日喀则市| 武强县| 阿巴嘎旗| 汤原县| 山东省| 宿州市| 南宫市| 元氏县| 荣昌县| 汤原县| 嘉黎县| 威海市| 武安市| 汤阴县| 伊宁县| 杭锦后旗| 武夷山市| 汕头市| 江孜县| 温宿县| 庐江县| 济南市| 宁远县| 会东县| 锦屏县| 临漳县| 五寨县| 龙胜| 卓资县| 昌江| 延安市| 华蓥市| 新干县|