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

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

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

    精彩的人生

    好好工作,好好生活

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks
    這是本人原創(chuàng)作品,如有轉(zhuǎn)載,請注明出處。

     

    前面的那篇文章emf&gef之一example.my.gefpractice講述的是如何將emfgef結(jié)合起來使用。

    在實(shí)際的項(xiàng)目開發(fā)中模型的是根據(jù)需求來定的,可以說模型事實(shí)上是業(yè)務(wù)邏輯。聲明這一點(diǎn)是為了說明本文研究內(nèi)容的必要性。

    前面的文章中使用的模型定義,包含x,y,w,h(他們確定了編輯器的一個矩形區(qū)域,這個矩形區(qū)域用來顯示模型的圖像),除此之外還包含了一個connection對象,每個nodeinputsoutputs

    簡單的說,前文中的模型是從編輯器的角度來定義模型的。

    假如從業(yè)務(wù)的角度來看,模型之間的關(guān)系是什么樣的呢?

    假如從業(yè)務(wù)上來看,node之間只有一個next關(guān)系,來表明先后順序。

     

    定義模型

     

    根據(jù)上面的分析,從新定義模型,如下圖所示:

    emfgef2_1.JPG

    第一篇文章中定義的模型,編輯器內(nèi)容序列化為xml文件格式為:

    <Diagram>
    <Node >
        
    <Connection />
    </Node>
    </Diagram>

    那么本文中的格式為

    <Diagram>
    <Node name=”node0” next=”node1”/>
    <Node name
    =”node1”/>
    </Diagram>

     

    創(chuàng)建工程

    與前面的文章一樣,利用這個ecore文件創(chuàng)建EMF Project,并根據(jù)生成的genmodel文件生成模型代碼。

     

    事件監(jiān)聽

        也與前面的文章一樣,對每個模型創(chuàng)建一個對應(yīng)的PropertySource文件,在EditPart中將PropertySource安裝給模型,并在EditPart中監(jiān)聽模型更改事件,做相應(yīng)處理。

     

    編輯器

     

    對模型而言,Connection對象是可有可無的,但是對編輯器而言,沒有了Connection對象,如何創(chuàng)建連線對象呢?

    所以我們需要寫Connection對象,這個對象只在GEF框架下使用,用來描述兩個節(jié)點(diǎn)間的next關(guān)系,不寫入xml文件。

     

    Connection.java

    public class Connection {
        
    protected Node source = null
    ;
        
    protected Node target = null
    ;
        
    public Connection() 
    {
        }

        
        
    public Node getSource() {
            
    return
     source;
        }

        
        
    public void setSource(Node newSource) {
            source 
    =
     newSource;
        }


        
    public Node getTarget() {
            
    return
     target;
        }


        
    public void setTarget(Node newTarget) {
            target 
    =
     newTarget;
        }


    }

     

    有了 Connection對象,并不代表就能正確使用它。

     

    首先,在NodeEditPart中定義兩個變量以及相應(yīng)的get方法

     

    NodesEditPart.java

    ……
    private
     ArrayList sourceConnections;
        
    private
     ArrayList targetConnections;
        ……
    public List getModelSourceConnections() 
    {
            
    if(this.sourceConnections==null
    )
                
    this.sourceConnections = new
     ArrayList();
            
    return
     sourceConnections;
        }

        
    public List getModelTargetConnections() {
            
    if(this.targetConnections==null
    )
                
    this.targetConnections = new
     ArrayList();
            
    return
     targetConnections;
        }

    ……

     

    接著在ConnectionCreateCommand中,在執(zhí)行這個命令的時候,給nodenext屬性賦值:

    public void execute() {
            connection 
    = new
     Connection();
            connection.setSource(source);
            connection.setTarget(target);
            sourcePart.getModelTargetConnections().add(connection);
            targetPart.getModelSourceConnections().add(connection);
            
            source.getNext().add(target);
    //模型屬性改變,會刷新相關(guān)的對象

            targetPart.refresh();//模型沒有改變,手工要求刷新
    }

     

    以上僅完成了創(chuàng)建一個Connection,完成了給Nodenext賦值。保存編輯器內(nèi)容,可以查看一下結(jié)果。

     

        假如重新打開剛剛保存的文件,發(fā)現(xiàn)問題了嗎?連線對象消失了。

           為什么呢?看看NodesEditPartFactory#createEditPart你會有收獲的。

     

        EMFxml文件反序列化為了一個數(shù)據(jù)結(jié)構(gòu),很明顯,這個數(shù)據(jù)結(jié)構(gòu)中沒有Connection對象。GEF將按照這個數(shù)據(jù)結(jié)構(gòu)提供的模型來初始化編輯器內(nèi)容,那么當(dāng)然會丟失連線。

     

        解決方法:創(chuàng)建一個TargetAddConnectionTable,它用來保存未完成的連線。

     

    NodesEditPartFactory.java

    private EditPart getPartForElement(Object modelElement) {
            
    if (modelElement instanceof Diagram) 
    {
                
    return new
     DiagramEditPart();
            }

            
    if (modelElement instanceof Node) {
                NodesEditPart nep 
    = new
     NodesEditPart();
                
                
    //add target connections

                if(TargetAddConnectionTable.getInstance().contains((Node) modelElement)){
                    List l 
    =
     TargetAddConnectionTable.getInstance().getValue((Node) modelElement);
                    
    if(l!=null && l.size()>0)
    {
                        
    for(int i=0; i<l.size(); i++)
    {
                            Connection c 
    =
     (Connection) l.get(i);
                            nep.getModelSourceConnections().add(c);
                            TargetAddConnectionTable.getInstance().remove(c);
                        }

                    }

                }

                
                
    //add source connections
                List l = ((Node)modelElement).getNext();
                
    if(l!=null && l.size()>0)
    {
                    
    for(int i=0; i<l.size(); i++)
    {
                        Connection c 
    = new
     Connection();
                        c.setSource((Node) modelElement);
                        c.setTarget((Node) l.get(i));
                        nep.getModelTargetConnections().add(c);
                        TargetAddConnectionTable.getInstance().add(c, c.getTarget());
                    }

                }

                
                
    return nep;
            }

            
    if (modelElement instanceof Connection) {
                
    return new
     ConnectionEditPart();
            }

            
    throw new RuntimeException(
                    
    "Can't create part for model element: "

                    
    + ((modelElement != null? modelElement.getClass().getName() : "null"));
        }

     

    TargetAddConnectionTable.java

    public class TargetAddConnectionTable {
        
    private Hashtable hs = null
    ;
        
    private static TargetAddConnectionTable table=null
    ;
        
        
    private TargetAddConnectionTable()
    {
                hs
    =new
     Hashtable();
        }

        
        
    public static TargetAddConnectionTable getInstance(){
            
    if(table==null
    )
                table 
    = new
     TargetAddConnectionTable();
            
    return
     table;
        }

        
        
    public void add(Connection connection, Node target ){
            hs.put( connection, target );
        }

        
        
    public void remove(Connection connection){
            hs.remove(connection);
        }

        
        
    public boolean contains(Node target){
            
    return
     hs.containsValue(target);
        }

        
        
    public List getValue(Node target){
            ArrayList result 
    = new
     ArrayList();
            Enumeration em 
    =
     hs.keys();
            Connection c 
    = null
    ;
            
    while(em.hasMoreElements())
    {
                c 
    =
     (Connection) em.nextElement();
                
    if
    (hs.get(c).equals(target))
                    result.add(c);
            }

            
    return result;
        }


    }

     

    再試試打開xml文件,應(yīng)該出現(xiàn)連線了。

     

    這里需要說明的是,由于本例比較簡單,TargetAddConnectionTable沒有出現(xiàn)太大問題。在實(shí)際應(yīng)用中發(fā)現(xiàn)TergetAddConnectionTable有不足,也做過了更正。筆者在此不再修改代碼。假如讀者有興趣,可以測測問題是什么,問題產(chǎn)生的原因以及如何解決。

     

    其他

    本例依然采用兩個action來打開編輯器。

    本例的運(yùn)行結(jié)果與前面的例子是一樣的,因?yàn)閺木庉嬈鞯慕嵌葋砜矗瑳]有變化。

     

    源碼

     

    點(diǎn)擊下載

     

    運(yùn)行環(huán)境

    JDK1.4

    Eclipse 3.1

    GEF

    EMF

     


    posted on 2005-12-15 13:44 hopeshared 閱讀(2704) 評論(0)  編輯  收藏 所屬分類: EMF&GEF
    主站蜘蛛池模板: 亚洲精品自在在线观看| 无码免费午夜福利片在线| 一个人看www免费高清字幕| 久久久久久亚洲av无码蜜芽| 亚洲国产精品美女久久久久| 亚洲日韩一区精品射精| 亚洲欧美日韩一区二区三区| 亚洲精品无码久久久久YW| 亚洲AV日韩AV永久无码色欲| 最新亚洲人成无码网站| 香蕉97碰碰视频免费| 菠萝菠萝蜜在线免费视频| 成人午夜免费视频| 99精品视频在线观看免费| 永久免费A∨片在线观看| 免费一区二区三区| 91精品国产免费久久国语麻豆| 18女人腿打开无遮掩免费| 18勿入网站免费永久| 大陆一级毛片免费视频观看| 日韩一区二区三区免费体验| 免费中文字幕不卡视频| 久久乐国产精品亚洲综合| 亚洲成AV人在线播放无码| 亚洲第一页在线观看| 亚洲欧美不卡高清在线| eeuss影院免费直达入口| 久久免费视频观看| 国产成人精品免费视频大| 免费羞羞视频网站| 久久亚洲国产成人影院网站 | www永久免费视频| 久草免费福利视频| av大片在线无码免费| 日本高清免费不卡在线| 国产L精品国产亚洲区久久| 无码久久精品国产亚洲Av影片| 亚洲a级片在线观看| 国产精品手机在线亚洲| 国产免费一区二区三区不卡| 国产成人精品免费视频大全麻豆|