<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)載,請(qǐng)注明出處。

     

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

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

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

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

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

    假如從業(yè)務(wù)上來看,node之間只有一個(gè)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)建工程

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

     

    事件監(jiān)聽

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

     

    編輯器

     

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

    所以我們需要寫Connection對(duì)象,這個(gè)對(duì)象只在GEF框架下使用,用來描述兩個(gè)節(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對(duì)象,并不代表就能正確使用它。

     

    首先,在NodeEditPart中定義兩個(gè)變量以及相應(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í)行這個(gè)命令的時(shí)候,給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);
    //模型屬性改變,會(huì)刷新相關(guān)的對(duì)象

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

     

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

     

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

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

     

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

     

        解決方法:創(chuàng)建一個(gè)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有不足,也做過了更正。筆者在此不再修改代碼。假如讀者有興趣,可以測(cè)測(cè)問題是什么,問題產(chǎn)生的原因以及如何解決。

     

    其他

    本例依然采用兩個(gè)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) 評(píng)論(0)  編輯  收藏 所屬分類: EMF&GEF
    主站蜘蛛池模板: 国产美女被遭强高潮免费网站| 精品无码国产污污污免费| 精品国产人成亚洲区| 黄色免费网址在线观看| 免费人成动漫在线播放r18| 日本在线看片免费| 亚洲国产美女精品久久久久∴| 成人自慰女黄网站免费大全| 亚洲天堂中文字幕在线| 亚洲人成电影院在线观看| ww4545四虎永久免费地址| 亚洲国产成AV人天堂无码| 免费AA片少妇人AA片直播| 亚洲Av熟妇高潮30p| 色欲国产麻豆一精品一AV一免费 | 69av免费观看| 永久久久免费浮力影院| 亚洲精品无码久久久久久| 国产人成免费视频| 国产又黄又爽又大的免费视频| 久久精品国产亚洲| 亚洲AV永久无码精品网站在线观看 | 国产a v无码专区亚洲av| aa级毛片毛片免费观看久| 全免费a级毛片免费看不卡| 成a人片亚洲日本久久| 亚洲精品久久久www| 亚洲视频在线观看免费| 亚洲色大成网站www久久九| 亚洲精品无码专区久久同性男| a级在线免费观看| 亚洲人成综合在线播放| 亚洲男人天堂2020| 精品无码无人网站免费视频| 亚洲乱色伦图片区小说| 亚洲日韩精品射精日| 最近免费字幕中文大全| 亚洲国产综合第一精品小说| 亚洲成av人片天堂网老年人| 8090在线观看免费观看| 午夜亚洲国产精品福利|