posts - 36, comments - 30, trackbacks - 0, articles - 3

          流程設計器開發九(屬性頁部分)

          Posted on 2008-01-14 08:59 笑看人生 閱讀(2040) 評論(5)  編輯  收藏 所屬分類: Java插件開發

          這一節主要介紹如何給編輯器增加屬性頁,屬性頁主要用來顯示編輯器中選中對象的屬性的,比如在編輯器選中活動,可以在屬性頁上顯示活動的大小和位置等信息,要實現這一功能,首先要讓模型實現IPropertySource接口,我們讓模型的基類ModelElement實現這個接口,基類要實現這接口中六個方法,這六個方法如下:


          /** An empty property descriptor. */
                 
          private static final IPropertyDescriptor[] EMPTY_ARRAY = new IPropertyDescriptor[0];
          /**
                  * Returns a value for this property source that can be edited in a property sheet.   

                
                  * 
          @return this instance
                  
          */

                 
          public Object getEditableValue() {         
                        
          return this;
                 }

                 
          /**
                  * Children should override this. The default implementation returns an empty array.
                  
          */

                 
          public IPropertyDescriptor[] getPropertyDescriptors() {           
                        
          return EMPTY_ARRAY;
                 }

                 
                 
          /**
                  * Children should override this. The default implementation returns null.
                  
          */

                 
          public Object getPropertyValue(Object id) {
                        
          // TODO Auto-generated method stub
                        return null;
                 }

                 
                 
          /**
                  * Children should override this. The default implementation returns false.
                  
          */

                 
          public boolean isPropertySet(Object id) {
                        
          // TODO Auto-generated method stub
                        return false;
                 }

                 
          /**
                  * Children should override this. The default implementation does nothing.
                  
          */

                 
          public void resetPropertyValue(Object id) {
                        
          // TODO Auto-generated method stub
                        
                 }

                 
          /**
                  * Children should override this. The default implementation does nothing.
                  
          */

                 
          public void setPropertyValue(Object id, Object value) {
                        
          // TODO Auto-generated method stub
                        
                 }

          這六個方法的含義在JavaDoc中已經說的很清楚了,在這個類中我們還定義了IPropertyDescriptor類型的數組,這個數組的作用是存放要顯示屬性的名稱,由于根模型沒有什么可顯示的屬性,所以為空。當我們在編輯器中選中活動時,在屬性頁上要顯示它的屬性,因此我們應該在AbstractActivity類中覆蓋父類中相應的方法,代碼如下:

          /** 
                  * 活動要顯示屬性的名稱
                  * There is one IPropertyDescriptor entry per editable property.
                  * 
          @see #getPropertyDescriptors()
                  * 
          @see #getPropertyValue(Object)
                  * 
          @see #setPropertyValue(Object, Object)
                  
          */

                 
          private static IPropertyDescriptor[] descriptors;
                 
          /*
                  * Initializes the property descriptors array.
                  * @see #getPropertyDescriptors()
                  * @see #getPropertyValue(Object)
                  * @see #setPropertyValue(Object, Object)
                  
          */

                 
          static {
                        descriptors 
          = new IPropertyDescriptor[] 
                                      
          new TextPropertyDescriptor(XPOS_PROP, "X"), // id and 

          description pair
                                      
          new TextPropertyDescriptor(YPOS_PROP, "Y"),
                                      
          new TextPropertyDescriptor(WIDTH_PROP, "Width"),
                                      
          new TextPropertyDescriptor(HEIGHT_PROP, "Height")
                                      
                        }
          ;
                        
          // use a custom cell editor validator for all four array entries
                        for (int i = 0; i < descriptors.length; i++{
                               
                                      ((PropertyDescriptor) descriptors[i]).setValidator(
          new 

          ICellEditorValidator() 
          {
                                             
          public String isValid(Object value) {
                                                    
          int intValue = -1;
                                                    
          try {
                                                           intValue 
          = Integer.parseInt((String) 

          value);
                                                    }
           catch (NumberFormatException exc) {
                                                           
          return "Not a number";
                                                    }

                                                    
          return (intValue >= 0? null : "Value must be >= 

          0";
                                             }

                                      }
          );
                               }
                             
                                             
                 }
           // static
                 /**
                  * Returns an array of IPropertyDescriptors for this AbstractActivity.
                  * <p>The returned array is used to fill the property view, when the edit-part 

          corresponding
                  * to this model element is selected.</p>
                  * 
          @see #descriptors
                  * 
          @see #getPropertyValue(Object)
                  * 
          @see #setPropertyValue(Object, Object)
                  
          */

                 
          public IPropertyDescriptor[] getPropertyDescriptors() {
                        
          return descriptors;
                 }

           
                 
          /**
                  * Return the property value for the given propertyId, or null.
                  * <p>The property view uses the IDs from the IPropertyDescriptors array 
                  * to obtain the value of the corresponding properties.</p>
                  * 
          @see #descriptors
                  * 
          @see #getPropertyDescriptors()
                  
          */

                 
          public Object getPropertyValue(Object propertyId) {
                        
          if (XPOS_PROP.equals(propertyId)) {
                               
          return Integer.toString(location.x);
                        }

                        
          if (YPOS_PROP.equals(propertyId)) {
                               
          return Integer.toString(location.y);
                        }

                        
          if (HEIGHT_PROP.equals(propertyId)) {
                               
          return Integer.toString(size.height);
                        }

                        
          if (WIDTH_PROP.equals(propertyId)) {
                               
          return Integer.toString(size.width);
                        }

                        
          return super.getPropertyValue(propertyId);
                 }

                 
                 
          /**
                  * Set the property value for the given property id.
                  * If no matching id is found, the call is forwarded to the superclass.
                  * <p>The property view uses the IDs from the IPropertyDescriptors array to set the 

          values
                  * of the corresponding properties.</p>      
                  
          */

                 
          public void setPropertyValue(Object propertyId, Object value) {
                        
          if (XPOS_PROP.equals(propertyId)) {
                               
          int x = Integer.parseInt((String) value);
                               setLocation(
          new Point(x, location.y));
                        }
           else if (YPOS_PROP.equals(propertyId)) {
                               
          int y = Integer.parseInt((String) value);
                               setLocation(
          new Point(location.x, y));
                        }
           else if (HEIGHT_PROP.equals(propertyId)) {
                               
          int height = Integer.parseInt((String) value);
                               setSize(
          new Dimension(size.width, height));
                        }
           else if (WIDTH_PROP.equals(propertyId)) {
                               
          int width = Integer.parseInt((String) value);
                               setSize(
          new Dimension(width, size.height));
                        }
           else {
                               
          super.setPropertyValue(propertyId, value);
                        }

                 }


          我們首先定義一個IPropertyDescriptor類型的數組,然后初始化這個數組,該數組存放要顯示活動的屬性,這里我們顯示活動圖形的坐標,大小屬性,由于屬性頁既能顯示屬性,還能編輯屬性,而坐標和大小屬性只能輸入數字,所以我們加入了校驗,如果給這些屬性輸入字符,就拋異常。getPropertyValue方法就是得到IPropertyDescriptor數組中對應屬性名的屬性值,setPropertyValue方法就是對屬性值進行修改時,要同時修改模型的屬性,讓模型通知控制器來刷新視圖,例如我們修改坐標x的值,編輯器中活動

          的位置就要發生改變,

          Feedback

          # re: 流程設計器開發九(屬性頁部分)  回復  更多評論   

          2008-01-14 15:50 by anone
          LZ辛苦了。。。研究中,向你學習。。。
          我看了 三中提供的代碼,不知如何運行才看到界面呢?
          現在有新的代碼提供下載嗎?

          # re: 流程設計器開發九(屬性頁部分)  回復  更多評論   

          2008-01-14 16:03 by anone
          現在正在研究中,要命啊。LZ能多給點資料嗎?謝謝了。我留郵箱吧:
          a_none@163.com

          # re: 流程設計器開發九(屬性頁部分)  回復  更多評論   

          2008-01-14 16:24 by 玩轉Java
          三中下載的代碼已經包含現在的內容了,要看到界面,只要把插件項目,運行為工作臺,載新建一個擴展名為workflow的文件,打開這個文件就可以看到效果了。在下一節,我將介紹如何通過向導來新建工作流文件。

          # re: 流程設計器開發九(屬性頁部分)  回復  更多評論   

          2008-01-15 17:21 by anone
          好的,謝謝LZ 了。。。

          # re: 流程設計器開發九(屬性頁部分)[未登錄]  回復  更多評論   

          2010-06-29 16:00 by 啊啊
          代碼一樣,屬性頁怎么就顯示不出來呢?
          主站蜘蛛池模板: 绿春县| 井冈山市| 垦利县| 余干县| 石狮市| 积石山| 旌德县| 荥经县| 宣化县| 漳浦县| 开原市| 电白县| 象州县| 延安市| 稻城县| 建水县| 岳阳市| 梓潼县| 襄城县| 黎川县| 察雅县| 延津县| 海宁市| 翼城县| 梅河口市| 东光县| 土默特左旗| 乌审旗| 蓝田县| 盘山县| 邛崃市| 阜平县| 武冈市| 云林县| 阳信县| 贺州市| 广德县| 逊克县| 额尔古纳市| 凤台县| 桦南县|