<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
    主站蜘蛛池模板: 激情综合色五月丁香六月亚洲| 成人性生交大片免费看午夜a| 84pao国产成视频免费播放| 在线观看的免费网站无遮挡| 四虎在线最新永久免费| 夫妻免费无码V看片| 全部免费毛片免费播放| 亚洲va久久久噜噜噜久久男同| 亚洲欧洲自拍拍偷综合| 久久精品国产亚洲av品善| 精品国产污污免费网站入口在线| 99热精品在线免费观看| 在线a级毛片免费视频| www.91亚洲| 亚洲黄色在线视频| 亚洲人片在线观看天堂无码| 亚洲精品黄色视频在线观看免费资源| 亚洲国产精品免费视频| 国产精品免费一级在线观看| 亚洲精品亚洲人成人网| 亚洲国产最大av| 巨胸喷奶水www永久免费| 性短视频在线观看免费不卡流畅 | 一二三四免费观看在线电影 | 在线观看免费黄网站| 成人免费的性色视频| 亚洲Av无码乱码在线znlu| 中文字幕亚洲第一在线| 男女猛烈xx00免费视频试看| 久久这里只精品热免费99| 午夜视频免费成人| 亚洲av片劲爆在线观看| 亚洲国产成人久久综合| 国产精品免费一区二区三区四区| 免费特级黄毛片在线成人观看| 亚洲国产精品成人精品无码区在线| 亚洲依依成人亚洲社区| 国产成人无码区免费网站| 精品国产一区二区三区免费看| 亚洲精品在线观看视频| 香蕉视频免费在线|