邋遢居

          我的Java天堂

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks
          ?

          gef項目中連線一直扮演這個不可或缺的角色。碰巧前段時間有個機會好好的看了這個部分的內(nèi)容。下面就把我的一點點認識和大家分享。

          首先要在模型上支持,能夠保存連接的信息。對于不同的項目有不同的要求。我們通過兩個例子就可以看出這一點來。

          1http://www13.plala.or.jp/observe/GEF/示例中的GEF6.zip (下面稱這個例子為HelloWold

          運行的結(jié)果入下圖所示:

          hellwoui.jpg

          它的模型可以使用如下的類圖來表示:

          LineConnectionModel-i.jpg

          用來描述Connection的分別是LineConnectionModelArrowConnectionModel這兩個類。這兩個類的父類和圖形模型(HellowModel)相關(guān)。

          2IBM紅皮書中的GEF范例(下面稱這個例子為workflow)

          運行效果如下圖:

          gefrun.jpg

          他的模型可用下面的類圖描述:

          gefredbook.jpg

          其實連接的模型應(yīng)該很簡單,他只要能保存他的兩端的對象就好了。圖形模型(如HelloWold中的HelloModel)能夠保持與他相關(guān)連的連接(HelloWold中的LineConnectionModelArrowConnectionModel)。

          看完了Model,我們下面就可以看看EditPart部分了。

          要看EditPart當然是要看最關(guān)鍵的了。也就是和連接直接關(guān)聯(lián)的EditPart了。分別察看了和連接相關(guān)的EditPart,發(fā)現(xiàn)他們都會實現(xiàn)一個叫org.eclipse.gef.NodeEditPart的接口。如下圖所示:

          ShapeEditPart-a.jpg

          nodeEditPart中有四個方法需要實現(xiàn)。通過這個四個方法的名字就可以看出他們和Anchor2密切相關(guān)。下面就來看看這幾個方法的具體功能:

          ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection);

          當需要畫連接的時候,通過這個方法獲取連接的源錨點。不管這個錨點在什么位置,他取得以后直接就用它作為源點了。

          ConnectionAnchor getSourceConnectionAnchor(Request request);

          當在準備創(chuàng)建連接的時候,通過Request來獲取新連接的源錨點。

          另外的兩個就不再啰嗦了。是為了獲得目標的錨點。


          但是我們肯定看到了HelloWoldWorkflow中的連接有點不一樣。HelloWold中直接是圖元上的,而workflow是通過連接基本圖元上面的一個子圖元而連接的。簡單來說就是他們連接的anchor有點不一樣,這樣就會出現(xiàn)執(zhí)行結(jié)果的不同。

          下面來看看他們到底是怎么實現(xiàn)的。根據(jù)上面提到的。錨點的獲取是通過getSourceConnectionAnchorgetTargetConnectionAnchor方法來獲取的。我們只需要好好比對一下他們這幾個方法的不同就可以了。

          HelloWold中的getSourceConnectionAnchor

          public ConnectionAnchor getSourceConnectionAnchor(Request request) {

          returnnew ChopboxAnchor(getFigure());

          }

          這里就簡單的創(chuàng)建一個 ChopboxAnchor 就好了。這個就可以直接連到該Figure上了。

          workflow中這個情況稍微有一點復(fù)雜了。先不說,還是看看他的 getSourceConnectionAnchor 是怎么實現(xiàn)的。

          public ConnectionAnchor getSourceConnectionAnchor(

          ConnectionEditPart connection) {

          Connection edge = (Connection) connection.getModel();

          return getNodeFigure().getConnectionAnchor(edge.getSource().getName());

          }


          /**

          *returnsananchorgivenitsname

          *

          *@paramportNamenameoftheanchor

          *@returntheanchorwiththename<code>portName</code>

          */

          public ConnectionAnchor getConnectionAnchor(String portName) {

          return (ConnectionAnchor)connectionAnchors.get( portName );

          }


          protected Hashtable connectionAnchors = new Hashtable(7);


          /**

          *Addaninputportanditsanchor

          *

          *@paramportName

          *uniquenametorefertotheport

          */

          publicvoid addInput(String portName) {

          InputPortFigure inputPort = new InputPortFigure();

          add(inputPort);


          PortConnectionAnchor anchor = new PortConnectionAnchor(inputPort);

          getTargetConnectionAnchors().add(anchor);

          connectionAnchors.put(portName, anchor);

          }


          通過這幾個方法可以看出它是在添加Input時候就創(chuàng)建好了一個和PortFigure 相關(guān)Anchor并把它保存起來。在要用的時候就把它取出來。這樣就搞定了。

          具體的可以參考這兩個例子的代碼。好了,打完收工。


          參考文檔

          IBM 紅皮書

          1荒野困獸(老臉歸來)’blog

          2GEF 進階,第一部分: Anchor


          posted on 2007-01-08 17:09 Jet Geng 閱讀(2846) 評論(1)  編輯  收藏 所屬分類: EclipseGEF

          Feedback

          # re: 關(guān)于GEF中的Connection 2008-01-13 12:23 sunflower
          你好 我用EMF和GEF做了一個可視化開發(fā)界面,在給兩個圖形之間添加連接時候,結(jié)果沒有顯示,并且將這兩個圖形全部刪除了。系統(tǒng)報的error是 unhandled event loop renson:java.lang.Stack overflow createConnectionCommand應(yīng)該沒有問題的 ,因為那是現(xiàn)有的代碼。能不能麻煩你給指點一下。謝謝!




            回復(fù)  更多評論
            

          主站蜘蛛池模板: 仙桃市| 沭阳县| 郓城县| 澎湖县| 沽源县| 松阳县| 屏东县| 商河县| 资溪县| 桑日县| 太湖县| 绥滨县| 罗田县| 三门峡市| 大港区| 大石桥市| 文登市| 威海市| 大同县| 耿马| 井研县| 云浮市| 交城县| 镇巴县| 安福县| 刚察县| 雷波县| 收藏| 红桥区| 上栗县| 尖扎县| 辽中县| 韶山市| 伊宁县| 滨海县| 汉川市| 松滋市| 甘孜县| 紫阳县| 丁青县| 乐亭县|