Feeling

              三人行,必有我師焉

             ::  :: 新隨筆 :: 聯系 ::  :: 管理 ::
            185 隨筆 :: 0 文章 :: 392 評論 :: 0 Trackbacks
          DataSet Joint
          一個簡單的Dataset Joint Example

          一般來說,Eclipse插件開發用到GEF的機會并不是很多,大概也就是結構設計,數據管理,流程控制等應用罷了。看了一下網上的例子,大部分都是基于數據庫管理的,我想這應該是因為數據庫設計的Dataset Joint是程序開發最常見的吧。

          GEF的一個簡單Example可以參加GEF自帶的例子Logic,功能非常強大,了解了Logic,就能夠了解相應的GEF開發。在網上這方面的教程并不多,我也基本上沒開,我個人始終認為看書不如看代碼。當然我以前也沒有接觸過GEF,畢竟要完全掌握這個東西并非一日之功,要想在上面有所造詣不通過一個大型項目的加強是不可能的。上面的這個小東西也是我花了半個月,還請教了一些人幫忙debug才研究出來的,還是花費了相當功夫。

          不過GEF是一套框架,上面的這個小東西,麻雀雖小,五臟俱全,而且基本上可以算一個不依賴于Eclipse平臺的小應用程序。不過GEF(Ver 3.3)這個項目依賴于Eclipse OSGI,如果想完全獨立于Eclipse,需要自己做一些小小的改變,也不算太麻煩。最后基本上SWT+JFACE+GEF基本上就可以自己做應用了。

          獨立于Eclipse的GEF簡單教程可以參見:
          http://www13.plala.or.jp/observe/GEF/GEF_StandAlone.html
          http://www13.plala.or.jp/observe/GEF/GEF_Tool_StandAlone.html

          日文寫的,我看不懂,只看代碼。

          這里我只說幾點:
          1、如果面板需要滾動條,并且能夠自由伸縮,顯示的話,請選擇ScrollingGraphicalViewer,相應的RootEditPart請選擇ScalableFreeformRootEditPart。

          2、GraphicalViewer是通過EditPartFactory拿到子EditPart的,有些類似于JFace TreeViewer的ContentProvider,根據特定的Element拿到對應的EditPart,不同于TreeViewer的是,GEF的getChildren方式是寫在EditPart里的,每一個EditPart都要實現 protected List getModelChildren( ) 方法,而TreeViewer的getChilder是在ContentProvider內部實現的。因此EditPart更為靈活,因為EditPart還可以通過EditPartFactory拿到上下文環境,而TreeViewer ContentProvider脫離了Viewer本身,只能通過Model來取,這樣當Model和Viewer不一致的時候,GEF游刃有余,而TreeViewer卻舉步維艱。

          3、EditPart的FeedBack Figure的背景顏色是和它的背景取異或操作的,因次再拖動EditPart的時候,如果FeedBack Figure覆蓋EditPart的時候,Figure的顏色很難看,解決這個問題的辦法就是設置GraphicalViewer的背景顏色為白色。

          4、希望EditPart能夠拖動,需要實現getDragTracker( )方法:

              public DragTracker getDragTracker( Request req )
              {
                  DragEditPartsTracker track 
          = new DragEditPartsTracker( this );
                  
          return track;
              }


          5、刷新EditPart的顯示需要覆寫protected void refreshVisuals( )方法,當Model的模型改變,需要刷新View的時候可以通過事件監聽來顯示的調用該方法。

          6、設置EditPart在父親EditPart的位置調用( (GraphicalEditPart) getParent( ) ). setLayoutConstraint(EditPart arg0, IFigure arg1, Object arg2)方法。 

          7、如果是XYLayoutEditPolicy,內部EditPart位置的改變會調用XYLayoutEditPolicy的protected Command createChangeConstraintCommand( EditPart child,
             Object constraint )方法,需要記錄EditPart位置可以在這里進行。

          8、EditPart的Selection事件需要注冊SelectionEditPolicy,你可以針對不同的EditPart實現不同的SelectionEditPolicy。

          9、內部有自由布局的EditPart需要注冊LayoutEditPolicy的子類。而該EditPart的Figure需要設置對應的LayoutManager。

          10、GraphicalViewer監聽Key操作需要setKeyHandler(new KeyHandler(viewer))。

          11、進行連接操作的源EditPart需要實現protected List getModelSourceConnections( )方法,目標EditPart需要實現protected List getModelTargetConnections( )方法,創建一個連接需要使用ConnectionDragCreationTool。連接圖形的EditPart必須繼承AbstractConnectionEditPart。實際上每個連接會被創建出2個EditPart,只有這2個EditPart的Model相等的時候,一個連接才會成立。

          12、如果需要連接,需要注冊GraphicalNodeEditPolicy,并且實現protected org.eclipse.gef.commands.Command getConnectionCompleteCommand(
             CreateConnectionRequest request )和protected org.eclipse.gef.commands.Command getConnectionCreateCommand(
             CreateConnectionRequest request )方法。注冊代碼:

          installEditPolicy( EditPolicy.GRAPHICAL_NODE_ROLE,
                          
          new ConnectionCreationEditPolicy( ) );


           先寫到這兒,慢慢再補。

          posted on 2007-04-30 18:35 三人行,必有我師焉 閱讀(3712) 評論(4)  編輯  收藏

          評論

          # re: GEF開發入門要點(個人經驗) 2007-11-20 09:20 lordtan
          沒人頂啊 ?
          我來頂一個  回復  更多評論
            

          # re: GEF開發入門要點(個人經驗) 2008-05-13 16:13 gef
          能不能把你的source code貼上來看看啊  回復  更多評論
            

          # re: GEF開發入門要點(個人經驗) 2008-07-22 00:59 路人
          支持一下   回復  更多評論
            

          # re: GEF開發入門要點(個人經驗) 2009-11-12 18:54 chunchong
          wang99567@163.com
          發份代碼學習一下吧  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          GitHub |  開源中國社區 |  maven倉庫 |  文件格式轉換 
          主站蜘蛛池模板: 灵璧县| 大安市| 中山市| 赞皇县| 鹤庆县| 马山县| 天镇县| 微博| 淮北市| 昌宁县| 两当县| 黑龙江省| 白沙| 盐池县| 同心县| 安龙县| 克拉玛依市| 云龙县| 石首市| 华容县| 南京市| 金秀| 罗甸县| 宁都县| 景东| 巴塘县| 寿宁县| 屏边| 永丰县| 称多县| 郎溪县| 青神县| 香河县| 宜川县| 原平市| 来安县| 景德镇市| 甘孜县| 白朗县| 兰坪| 轮台县|