<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    邋遢居

    我的Java天堂

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks
    ?

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

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

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

    運行的結果入下圖所示:

    hellwoui.jpg

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

    LineConnectionModel-i.jpg

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

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

    運行效果如下圖:

    gefrun.jpg

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

    gefredbook.jpg

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

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

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

    ShapeEditPart-a.jpg

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

    ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection);

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

    ConnectionAnchor getSourceConnectionAnchor(Request request);

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

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


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

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

    HelloWold中的getSourceConnectionAnchor

    public ConnectionAnchor getSourceConnectionAnchor(Request request) {

    returnnew ChopboxAnchor(getFigure());

    }

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

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

    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時候就創建好了一個和PortFigure 相關Anchor并把它保存起來。在要用的時候就把它取出來。這樣就搞定了。

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


    參考文檔

    IBM 紅皮書

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

    2GEF 進階,第一部分: Anchor


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

    Feedback

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




      回復  更多評論
      

    主站蜘蛛池模板: 亚洲AV色吊丝无码| 亚洲国产精品日韩在线| 男女超爽视频免费播放| 日韩成人免费视频播放| 亚洲GV天堂GV无码男同| 四虎永久免费网站免费观看| 国产精品亚洲色婷婷99久久精品| 午夜免费福利网站| 美女视频黄a视频全免费网站一区 美女视频黄a视频全免费网站色 | 亚洲AV成人一区二区三区观看| 午夜高清免费在线观看| 国产成人综合亚洲| 国产亚洲成归v人片在线观看| 中文字幕高清免费不卡视频| 午夜影视日本亚洲欧洲精品一区| 午夜免费啪视频在线观看| 亚洲福利一区二区| 精品国产精品久久一区免费式| 免费人成视频在线播放| 亚洲人成色77777| 天天影视色香欲综合免费| 亚洲爆乳少妇无码激情| 亚洲一区二区三区免费| 久久久久久成人毛片免费看| 亚洲人成影院在线高清| 高清在线亚洲精品国产二区| a级男女仿爱免费视频| 国产成人精品日本亚洲专一区| 国产一级理论免费版| 久草免费福利视频| 久久精品国产99国产精品亚洲| 免费人成在线观看播放国产 | 亚洲AV无码国产在丝袜线观看| 51精品视频免费国产专区| 亚洲性无码一区二区三区| 亚洲性日韩精品一区二区三区 | 国产精品视频白浆免费视频| 亚洲国产区男人本色在线观看| 亚洲AV无码乱码在线观看| 无码国产精品一区二区免费16| 亚洲AV无码一区二区乱子仑|