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 三人行,必有我師焉 閱讀(3708) 評論(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倉庫 |  文件格式轉換 
          主站蜘蛛池模板: 广德县| 武冈市| 文昌市| 馆陶县| 萍乡市| 陆丰市| 临桂县| 手游| 昌邑市| 重庆市| 曲水县| 昌都县| 成都市| 余庆县| 洛隆县| 册亨县| 通许县| 泗阳县| 丰原市| 隆子县| 通江县| 揭西县| 柳林县| 珠海市| 潞城市| 彭山县| 永新县| 舟曲县| 建瓯市| 三亚市| 巴里| 湄潭县| 锡林浩特市| 中宁县| 上杭县| 河南省| 邛崃市| 紫阳县| 凯里市| 镇原县| 湟中县|