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

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

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

    sharky的點滴積累

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      56 隨筆 :: 104 文章 :: 10 評論 :: 0 Trackbacks

    構(gòu)造一個GEF應(yīng)用程序通常分為這么幾個步驟:設(shè)計模型、設(shè)計EditPart和Figure、設(shè)計EditPolicy和Command,其中EditPart是最主要的一部分,因為在實現(xiàn)它的時候不可避免的要使用到EditPolicy,而后者又涉及到Command。

    現(xiàn)在我們來看個例子,它的功能非常簡單,用戶可以在畫布上增加節(jié)點(Node)和節(jié)點間的連接,可以直接編輯節(jié)點的名稱以及改變節(jié)點的位置,用戶可以撤消/重做任何操作,有一個樹狀的大綱視圖和一個屬性頁。點此下載,這是一個Eclipse的項目打包文件,在Eclipse里導(dǎo)入后運行Run-time Workbench,新建一個擴展名為"gefpractice"的文件就會打開這個編輯器。

    圖1 Practice Editor的使用界面

    你可以參考著代碼來看接下來的內(nèi)容了,讓我們從模型開始說起。模型是根據(jù)應(yīng)用需求來設(shè)計的,所以我們的模型包括代表整個圖的Diagram、代表節(jié)點的Node和代表連接的Connection這些對象。我們知道,模型是要負責把自己的改變通知給EditPart的,為了把這個功能分離出來,我們使用名為Element的抽象類專門來實現(xiàn)通知機制,然后讓其他模型類繼承它。Element類里包括一個PropertyChangeSupport類型的成員變量,并提供了addPropertyChangeListener()、removePropertyChangeListener()和fireXXX()方法分別用來注冊監(jiān)聽器和通知監(jiān)聽器模型改變事件。在GEF里,模型的監(jiān)聽器就是EditPart,在EditPart的active()方法里我們會把它作為監(jiān)聽器注冊到模型中。所以,總共有四個類組成了我們的模型部分。

    在前面的貼子里說過,大部分GEF應(yīng)用程序都是實現(xiàn)為Editor的,這個例子也不例外,對應(yīng)的Editor名為PracticeEditor。這個Editor繼承了GraphicalEditorWithPalette類,表示它是一個具有調(diào)色板的圖形編輯器。最重要的兩個方法是configureGraphicalViewer()和initializeGraphicalViewer(),分別用來定制和初始化EditPartViewer(關(guān)于EditPartViewer的作用請查看前面的帖子),簡單查看一下GEF的代碼你會發(fā)現(xiàn),在GraphicalEditor類里會先后調(diào)用這兩個方法,只是中間插了一個hookGraphicalViewer()方法,其作用是同步選擇和把EditPartViewer作為SelectionProvider注冊到所在的site(Site是Workbench的概念,請查Eclipse幫助)。所以,與選擇無關(guān)的初始化操作應(yīng)該在前者中完成,否則放在后者完成。例子中,在這兩個方法里我們配置了RootEditPart、用于創(chuàng)建EditPart的EditPartFactory、Contents即Diagram對象和增加了拖放支持,拖動目標是當前EditPartViewer,后面會看到拖動源就是調(diào)色板。

    這個Editor是帶有調(diào)色板的,所以要告訴GEF我們的調(diào)色板里都有哪些工具,這是通過覆蓋getPaletteRoot()方法來實現(xiàn)的。在這個方法里,我們利用自己寫的一個工具類PaletteFactory構(gòu)造一個PaletteRoot對象并返回,我們的調(diào)色板里需要有三種工具:選擇工具、節(jié)點工具和連接工具。在GEF里,調(diào)色板里可以有抽屜(PaletteDrawer)把各種工具歸類放置,每個工具都是一個ToolEntry,選擇工具(SelectionToolEntry)和連接工具(ConnectionCreationToolEntry)是預(yù)先定義好的幾種工具中的兩個,所以可以直接使用。對于節(jié)點工具,要使用CombinedTemplateCreationEntry,并把節(jié)點類型作為參數(shù)之一傳給它,創(chuàng)建節(jié)點工具的代碼如下所示。

    ToolEntry tool = new CombinedTemplateCreationEntry("Node""Create a new Node", Node.class, new SimpleFactory(Node.class), nullnull);

    在新的3.0版本GEF里還提供了一種可以自動隱藏調(diào)色板的編輯器GraphicalEditorWithFlyoutPalette,對調(diào)色板的外觀有更多選項可以選擇,以后的帖子里可能會提到如何使用。

    調(diào)色板的初始化操作應(yīng)該放在initializePaletteViewer()里完成,最主要的任務(wù)是為調(diào)色板所在的EditPartViewer添加拖動源事件支持,前面我們已經(jīng)為畫布所在EditPartViewer添加了拖動目標事件,所以現(xiàn)在就可以實現(xiàn)完整的拖放操作了。這里稍微講解一下拖放的實現(xiàn)原理,以用來創(chuàng)建節(jié)點對象的節(jié)點工具為例,它在調(diào)色板里是一個CombinedTemplateCreationEntry,在創(chuàng)建這個PaletteEntry時(見上面的代碼)我們指定該對象對應(yīng)一個Node.class,所以在用戶從調(diào)色板里拖動這個工具時,內(nèi)存里有一個TemplateTransfer單例對象會記錄下Node.class(稱作template),當用戶在畫布上松開鼠標時,拖放結(jié)束的事件被觸發(fā),將由畫布注冊的DiagramTemplateTransferDropTargetListener對象來處理template對象(現(xiàn)在是Node.class),在例子中我們的處理方法是用一個名為ElementFactory的對象負責根據(jù)這個template創(chuàng)建一個對應(yīng)類型的實例。

    以上我們建立了模型和用于實現(xiàn)視圖的Editor,因為模型的改變都是由Command對象直接修改的,所以下面我們先來看都有哪些Command。由需求可知,我們對模型的操作有增加/刪除節(jié)點、修改節(jié)點名稱、改變節(jié)點位置和增加/刪除連接等,所以對應(yīng)就有CreateNodeCommand、DeleteNodeCommand、RenameNodeCommand、MoveNodeCommand、CreateConnectionCommand和DeleteConnectionCommand這些對象,它們都放歸類在commands包里。一個Command對象里最重要的當然是execute()方法了,也就是執(zhí)行命令的方法。除此以外,因為要實現(xiàn)撤消/重做功能,所以在Command對象里都有Undo()和Redo()方法,同時在Command對象里要有成員變量負責保留執(zhí)行該命令時的相關(guān)狀態(tài),例如RenameNodeCommand里要有oldName和newName兩個變量,這樣才能正確的執(zhí)行Undo()和Redo()方法,要記住,每個被執(zhí)行過的Command對象實例都是被保存在EditDomain的CommandStack中的。

    例子里的EditPolicy都放在policies包里,與圖形有關(guān)的(GraphicalEditPart的子類)有DiagramLayoutEditPolicy、NodeDirectEditPolicy和NodeGraphicalNodeEditPolicy,另外兩個則是與圖形無關(guān)的編輯策略。可以看到,在后一種類型的兩個類(ConnectionEditPolicy和NodeEditPolicy)中我們只覆蓋了createDeleteCommand()方法,該方法用于創(chuàng)建一個負責"刪除"操作的Command對象并返回,要搞清這個方法看似矛盾的名字里create和delete是對不同對象而言的。

    有了Command和EditPolicy,現(xiàn)在可以來看看EditPart部分了。每一個模型對象都對應(yīng)一個EditPart,所以我們的三個模型對象(Element不算)分別對應(yīng)DiagramPart、ConnectionPart和NodePart。對于含有子元素的EditPart,必須覆蓋getModelChildren()方法返回子對象列表,例如DiagramPart里這個方法返回的是Diagram對象包含的Node對象列表。

    每個EditPart都有active()和deactive()兩個方法,一般我們在前者里注冊監(jiān)聽器(因為實現(xiàn)了PropertyChangeListener接口,所以EditPart本身就是監(jiān)聽器)到模型對象,在后者里將監(jiān)聽器從列表里移除。在觸發(fā)監(jiān)聽器事件的propertyChange()方法里,一般是根據(jù)"事件名"稱決定使用何種方式刷新視圖,例如對于NodePart,如果是節(jié)點本身的屬性發(fā)生變化,則調(diào)用refreshVisuals()方法,若是與它相關(guān)的連接發(fā)生變化,則調(diào)用refreshTargetConnections()或refreshSourceConnections()。這里用到的事件名稱都是我們自己來規(guī)定的,在例子中比如Node.PROP_NAME表示節(jié)點的名稱屬性,Node.PROP_LOCATION表示節(jié)點的位置屬性,等等。

    EditPart(確切的說是AbstractGraphicalEditpart)另外一個需要實現(xiàn)的重要方法是createFigure(),這個方法應(yīng)該返回模型在視圖中的圖形表示,是一個IFigure類型對象。一般都把這些圖形放在figures包里,例子里只有NodeFigure一個自定義圖形,Diagram對象對應(yīng)的是GEF自帶的名為FreeformLayer的圖形,它是一個可以在東南西北四個方向任意擴展的層圖形;而Connection對應(yīng)的也是GEF自帶的圖形,名為PolylineConnection,這個圖形缺省是一條用來連接另外兩個圖形的直線,在例子里我們通過setTargetDecoration()方法讓連接的目標端顯示一個箭頭。

    最后,要為EditPart增加適當?shù)腅ditPolicy,這是通過覆蓋EditPart的createEditPolicies()方法來實現(xiàn)的,每一個被"安裝"到EditPart中的EditPolicy都對應(yīng)一個用來表示角色(Role)的字符串。對于在模型中有子元素的EditPart,一般都會安裝一個EditPolicy.LAYOUT_ROLE角色的EditPolicy(見下面的代碼),后者多為LayoutEditPolicy的子類;對于連接類型的EditPart,一般要安裝EditPolicy.CONNECTION_ENDPOINTS_ROLE角色的EditPolicy,后者則多為ConnectionEndpointEditPolicy或其子類,等等。

    installEditPolicy(EditPolicy.LAYOUT_ROLE, new DiagramLayoutEditPolicy());

    用戶的操作會被當前工具(缺省為選擇工具SelectionTool)轉(zhuǎn)換為請求(Request),請求根據(jù)類型被分發(fā)到目標EditPart所安裝的EditPolicy,后者根據(jù)請求對應(yīng)的角色來判斷是否應(yīng)該創(chuàng)建命令并執(zhí)行。

    在以前的帖子里說過,Role-EditPolicy-Command這樣的設(shè)計主要是為了盡量重用代碼,例如同一個EditPolicy可以被安裝在不同EditPart中,而同一個Command可以被不同的EditPolicy所使用,等等。當然,凡事有利必有弊,我認為這種的設(shè)計也有缺點,首先在代碼上看來不夠直觀,你必須對眾多Role、EditPolicy有所了解,增加了學(xué)習(xí)周期;另外大部分不需要重用的代碼也要按照這個相對復(fù)雜的方式來寫,帶來了額外工作量。

    以上就是一個GEF應(yīng)用程序里最基本的幾個組成部分,例子中還有如Direct Edit、屬性表和大綱視圖等一些功能沒有講解,下面的帖子里將介紹這些常用功能的實現(xiàn)。

    posted on 2005-02-19 13:57 八進制 閱讀(8028) 評論(83)  編輯 收藏 收藏至365Key 所屬分類: Eclipse

    評論

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-02-23 23:59 郭奕
    如果我想給Node加入可視或者其他不可視的屬性,但是可以在propertyview里面編輯,應(yīng)該如何做呢?期盼答復(fù)! 謝謝。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-02-24 11:58 八進制
    應(yīng)該是這樣的:給模型里的Node類增加isVisible變量,當修改它的值時應(yīng)會觸發(fā)NodePart的propertyChange()方法,可以在這里根據(jù)isVisible的當前值更新視圖。注意屬性頁里要作為布爾值類型來編輯,節(jié)點不可見時相關(guān)連接應(yīng)該也不可見。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-02-25 01:46 郭奕
    您好,首先謝謝您答復(fù)我。因為最近導(dǎo)師讓我做流程驗證的程序,所以又有幾個問題要麻煩您。
    1.我給Node類里面增加了 Type 屬性,并加入了propertyDescriptor中,代碼如下:
    String[] comboBoxValues = {"Activity", "Control"};
    protected IPropertyDescriptor[] descriptors = new IPropertyDescriptor[] {
    new TextPropertyDescriptor(PROP_NAME,"Name"),
    new ComboBoxPropertyDescriptor(PROP_TYPE,"Type",comboBoxValues),
    };

    但是,在propertyViewer里面并沒有出現(xiàn)預(yù)期的ComboBox的結(jié)果,究竟是什么原因呢?
    2.如果我有了不同類型的Node,比如正方形的Node和圓形的Node,應(yīng)該繼承Node類新建兩個子類還是作為Node的屬性呢?是否一個模型可以對應(yīng)多個IFigure類呢?
    由于我本行不是編程,所以用GEF很困難,有些概念還不是那么清楚,請您抽出寶貴時間,幫我解答。萬分感謝!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-02-25 11:44 八進制
    1、除了改變descriptors以外,還要修改getPropertyValue()和setPropertyValue()方法:前者應(yīng)該返回Integer類型,代表combobox里的選項序號(從0開始);后者應(yīng)該將value參數(shù)強制轉(zhuǎn)換為Integer類型,得到用戶改變的選項序號,根據(jù)此值調(diào)用你的setType()方法。
    2、兩種方式應(yīng)該都能實現(xiàn),我想用子類的方法更直觀一些。一個模型可以對應(yīng)多個IFigure類,因為可以有多個視圖表現(xiàn)。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-02-28 04:32 郭奕
    謝謝你的解答。我最近一直在看這個例子。對GEF也有了一些初步的了解。我也對比了另外一個例子epctools,不知道你用過沒有?如果需要我可以給你下載的連接地址。
    感覺這個例子好的地方在于:
    1。Model層中將model的通知機制抽象出來,代碼更OO;
    2。Node由于實現(xiàn)了IPropertySource,可以在propertyView中即時修改Node的屬性。
    不好的地方(也可能是很好,但是我不太懂地方)
    1。Node節(jié)點沒有實現(xiàn)IPropertySource的接口;
    2。Node沒有子類,我試著擴展了Node,NodePart的createfigure也根據(jù)類型的不同進行了修改;PartFactory的createEditPart也修改了.具體代碼如下:
    protected IFigure createFigure() {
    try {
    switch (m_type) {
    case Node.TYPE_ACTIVITY: {
    m_figure = new ActivityFigure((ActivityNode) getModel());
    break;
    }
    case Node.TYPE_CONTROL: {
    m_figure = new ControlFigure((ControlNode) getModel());
    break;
    }

    default: {
    m_figure = new org.eclipse.draw2d.Label();
    break;
    }
    }
    } catch (ClassCastException e) {
    System.out
    .println("[controllers] NodePart.createFigure(): Check epc node type (Cast error)");
    }
    return m_figure;
    }。。。。。
    public EditPart createEditPart(EditPart context, Object model) {
    EditPart part = null;
    if (model instanceof Diagram)
    part = new DiagramPart();
    else if (model instanceof Connection)
    part = new ConnectionPart();
    else if (model instanceof ControlNode)
    part = new NodePart(Node.TYPE_CONTROL);
    // part = new NodePart();
    else if (model instanceof ActivityNode)
    part = new NodePart(Node.TYPE_ACTIVITY);
    else if (model instanceof MultiNode)
    part = new NodePart(Node.TYPE_MULTINODE);
    else
    part = new NodePart(Node.TYPE_NONE);
    part.setModel(model);
    return part;
    }

    我要做的程序功能很簡單,1.節(jié)點分為Activity(方的)、Control(圓的);
    2. 通過算法(已經(jīng)完成)找到圖中的arbitary cycle (block),每一個合法cycle用復(fù)雜節(jié)點表示(可以展開).
    我要把epcTools這個例子改一改。
    有興趣的話可以看看這個基于GEF的EpcTools的例子。
    http://wwwcs.upb.de/cs/kindler/Forschung/EPCTools/download.html
    再次謝謝你給予的無私的幫助!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-02-28 10:38 八進制
    “Node由于實現(xiàn)了IPropertySource”和“Node節(jié)點沒有實現(xiàn)IPropertySource的接口”矛盾哦。
    一般應(yīng)用里Node是應(yīng)該有子類的,這時讓Node作為抽象類更合適些,例如你的Activity和Control都應(yīng)該繼承Node類。
    有一些基礎(chǔ)以后,一定要看看Eclipse提供的Logic或Flow例子,它們是GEF的開發(fā)人員參與編寫的,很有代表性。
    能給你帶來幫助我也很高興!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-03-01 10:10 郭奕
    對不起,寫錯啦。我想說那個EPCTools的例子的Node節(jié)點沒有實現(xiàn)IPropertySource的接口。Eclipse的Logic的例子SourceCode,怎么放到Project里面運行啊?我看了一下,好像它提供的plugin.xml不太對
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-03-01 14:29 八進制
    我只在2.1版本里運行過Logic例子,它現(xiàn)在有了新的版本,外觀也稍有不同。你要確定使用的是能在你的Eclipse版本里運行的Logic,應(yīng)該很容易裝的。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-03-02 06:00 郭奕
    我在3.0.1里面運行例子也沒有問題。:P.我想看它的源代碼,并能編譯運行。
    另外可以知道你的MSN嗎?我的是eric_guoyi@hotmail.com
    我下載了org.eclipse.gef.examples.source_3.0.1。可是不知道如何放在Eclipse的workbench里面運行.
    最近怎么不繼續(xù)寫下去了。。確實對我的幫助很大
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-03-02 06:26 郭奕
    運行l(wèi)ogic的sourceCode那個問題已經(jīng)解決了。謝謝。要在plugin.xml里面的requires加入如下
    <import plugin="org.eclipse.core.runtime.compatibility"/>
    <import plugin="org.eclipse.ui.ide"/>
    <import plugin="org.eclipse.ui.views"/>
    <import plugin="org.eclipse.jface.text"/>
    <import plugin="org.eclipse.ui.workbench.texteditor"/>
    <import plugin="org.eclipse.ui.editors"/>
    <import plugin="org.eclipse.gef"/>
    <import plugin="org.eclipse.core.resources"/>
    <import plugin="org.eclipse.ui"/>
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-03-03 10:46 八進制
    抱歉,最近比較忙,接下來的文章得過一段時間再續(xù)寫了。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-03-07 13:02 howjay
    奇怪,我下了你的例子,不過在 PracticeEditor-OutlinePage 有這個錯誤:

    “不能解析類型 org.eclipse.ui.views.contentoutline.IContentOutlinePage。從必需的 .class 文件間
    接引用了它”

    這個是什么問題?明明 import 了org.eclipse.ui.views.contentoutline.IContentOutlinePage; 啊
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-03-07 13:03 howjay
    對了,我只安裝了 GEF 的 runtime 版本,沒有安裝 SDK,現(xiàn)在這個錯誤和我以前說的那個 pt1-pt6 例子的錯誤會不會有關(guān)系啊?我去下個sdk試試
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-03-07 13:05 howjay
    不好意思,我的意思是說這些例子我運行不起來是不是和我沒有安裝sdk有關(guān)系,不是說那兩個錯誤之間有關(guān)系-__-
      

    # redbook里面提到的sg246302 的例子如何修改才能在3.0里面運行? 2005-03-12 22:10 郭奕
    redbook里面提到的sg246302 的例子如何修改才能在3.0里面運行? 另外你看到過介紹GEF自帶的logic和flow例子的文章嗎?有點復(fù)雜,很多地方看不太懂。

      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-03-14 10:39 八進制
    sg246302和介紹logic/flow的文章我都沒看過,我覺得應(yīng)該有些基礎(chǔ)以后再看,最好自己做做簡單的應(yīng)用。我馬上要開始用GEF做項目了,到時會把更多心得寫下來的。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-13 11:38 upcxcf
    清問我的是ecilipse2.1和GEF2.1請問對于你的代碼我怎么修改呢。我才可以正確地使用呢。謝謝
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-13 13:38 八進制
    是你們的項目要求版本嗎,如果不是換成3.0以上是最方便的辦法。
    Eclipse帶了一個Migration Guide文檔,里面是從2.1到3.0版本需要修改的地方,你可以參考一下。前面說的pt1~pt6的例子本身就是在2.1下運行的,你也可以先看它們。
    我自己做的這些例子都沒考慮2.1版本,比如后面帖子里說的Ruler/Guide那些功能就必須GEF3.0以上版本,另外一些功能簡單的例子你可以試試放在2.1里看有什么錯誤,如果只是plugin引用的問題應(yīng)該可以通過修改plugin.xml文件改好的。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-13 15:27 upcxcf
    您好,我得是eclipse2.1和GEF2.1。我想問下上面得例子在我導(dǎo)入工程后,出現(xiàn)好多錯誤。請問我該怎么做?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-13 15:36 upcxcf
    謝謝八進制 ,我是下載了一個別人做好得GEF插件。我現(xiàn)在用的是GEF2.1的。后來我看他的代碼中有<import plugin="org.eclipse.gef" version="2.0.1"/>。而我的版本是gef2.1的。所以那個插件不能用的。我在www.eclispe.org上又沒有找到這么低版本的。最少的也是2.1。請問我該怎么辦?
    后來我看了你的帖子。他的功能和你上面提出的一樣的。就是連線和其他的幾個圖形連接。你看我該怎么修改呢?
    因為時間很緊。所以請賜教。QQ61757325.急盼
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-13 16:20 八進制
    把version="2.0.1"去掉看看,我覺得2.1的GEF應(yīng)該可以運行2.0.1做的程序。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-13 16:20 upcxcf
    ni好,我換成ECLIPSE3.0和GEF3.0后,導(dǎo)入工程gefpractice.后,怎么還是不可一呢?出現(xiàn)好些錯誤。
    請把在Eclipse里導(dǎo)入后運行Run-time Workbench,新建一個擴展名為"gefpractice"的文件就會打開這個編輯器。 。詳細說下。謝謝
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-13 22:36 八進制
    我剛剛得知,GEF第一個版本就是2.1,他代碼里的2.0.1是怎么回事……
    出現(xiàn)的錯誤是什么,在Eclipse的Problems視圖里應(yīng)該有錯誤信息,貼來看一下吧。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-23 08:54 upcxcf
    你好,我這里有個簡單的GEF應(yīng)用程序源代碼。但是我無法讓它正常工作。很是著急。功能和你上面的很類似。我的MSN是upcxcf@hotmail.com。在線等。希望賜教
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-23 22:16 八進制
    不好意思,今天一天都沒連上這里,現(xiàn)在剛看到你的留言。你可以把那個工程(大小不要超過1M)發(fā)到我郵箱里我?guī)湍憧纯词裁磫栴}。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-24 09:41 xunix
    請問一下您的例子中的NodeFigure這個類似乎沒有被其他類用到啊,這個類到底是怎么工作的啊?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-24 15:08 八進制
    有用到啊,在NodePart的createFigure()方法里返回的就是一個NodeFigure實例。這個Figure的作用沒有什么特別,就是表現(xiàn)一個黑框包圍的矩形,中間有一個標簽。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-25 08:41 upcxcf
    八進制,您好,謝謝.但是我不知道你的信箱......????謝謝你的幫助.我的這個例子.你和上面的很相似.就是幾個圖形,然后加上連接線的.急切的等待你的回復(fù)
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-25 13:12 八進制
    按網(wǎng)頁最上面的“聯(lián)系”鏈接可以看到我的郵箱,因為會有垃圾郵件所以不敢發(fā)在這里,見諒!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-26 10:08 UPCXCF
    已經(jīng)在聯(lián)系中給你發(fā)了一封信,但是還沒有得到您的回復(fù),無法將我的一個GEF小的應(yīng)用程序發(fā)給你.請EMAIL回復(fù)下吧.謝謝.急
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-26 13:26 八進制
    暫時還沒有收到你的信,你把你的程序打包發(fā)到“聯(lián)系”里看到的地址即可。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-27 08:45 upcxcf
    八進制 ,聯(lián)系里找了半天沒有你的地址.
    您先發(fā)一份信到我的 信箱吧upcxcfzl@163.com.我再回復(fù)你吧.
    目前比較著急的.謝謝.等待您的來信.萬分感謝
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-29 17:30 upcxcf
    請問最后得到的EMF圖形化編輯器它有什么作用.?如下面的網(wǎng)頁
    http://eclipse.org/emf/docs.php?doc=docs/xlibmod/xlibmod_emf1.1.html
    得到文本的描述有什么作用?得到網(wǎng)頁最后的一個圖有什么作用那?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-31 10:04 xunix
    請問一下,Node節(jié)點畫出來的過程是怎樣的啊?我的理解是這樣的:DiagramPart在收到請求后,將請求發(fā)送給DiagramLayoutEditPolicy, DiagramLayoutEditPolicy.java在接到請求后就去調(diào)用CreateNodeCommand,然后就創(chuàng)建了Node,但是這樣的問題是,為什么NodeFigure是在NodePart里面創(chuàng)建的呢?請解答一下,謝謝!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-31 10:40 八進制
    CreateNodeCommand負責操作模型,在它的execute()方法里應(yīng)該有類似diagram.addChild()的語句用來把新建的Node加為diagram的子元素,這個addChild()方法會觸發(fā)監(jiān)聽器(DiagramPart)的propertyChanged()方法,這里在得知diagram新增了子元素時會調(diào)用refreshChildren()方法,在這個方法里將生成新建Node所對應(yīng)的EditPart(通過你的EditPartFactory),并通過addChild()調(diào)用EditPart的createFigure()得到Node的圖形,添加在diagram圖形的contentPane上。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-31 11:09 xunix
    謝謝你的解答,但是我還是有點不明白的是,在DiagramLayoutEditPolicy中并沒有調(diào)用CreateNodeCommand的execute()這個方法啊,那么這個方法是怎么自動執(zhí)行的呢?謝謝!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-31 11:21 xunix
    還有請問一下,你提到的EditPartFactory我該怎么來建啊?謝謝
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-31 13:20 八進制
    DiagramLayoutEditPolicy只負責返回command,你從工具欄里拖動一個節(jié)點到畫布上,當你松開鼠標的時候,Viewer上注冊的TemplateTransferDropTargetListener會得到這個command并調(diào)用CommandStack.execute(cmd)(這里會調(diào)用cmd的execute()方法,用CommandStack主要是為了實現(xiàn)undo和redo)。
    EditPartFactory的實現(xiàn)在代碼里有,名叫PartFactory,你看一下就知道了,很容易。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-31 13:49 xunix
    不好意思,今天問您這么多問題。我現(xiàn)在遇到了一個問題是當我新增加了一種Node后,不知道如何通過refreshChildren()方法來新建我這種新Node對應(yīng)的EditPart,請您詳細解答一下這個過程,謝謝!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-31 21:40 NetWeaver
    請問一下,如果我給Node增加一個屬性后怎么給這個屬性初始化一個值啊,就像NAME這個屬性就有一個初始化的“Node”的值,我看了您的源代碼,發(fā)現(xiàn)了一個String name="node", 但是不知道這個值是怎么賦到屬性中去的,請賜教,謝謝!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-05-31 22:35 八進制
    xunix: 只要在DiagramPart的propertyChanged()方法里判斷是哪個屬性被改變,如果是children有變化,執(zhí)行refreshChildren()即可。
    NetWeaver: String name="Node"就是給name屬性初始化值了,比如你新增一個price屬性,就寫int price=100就可以了,是不是我沒明白你的問題?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-06-01 16:53 NetWeaver
    我的意思是,Node這個值是怎么傳遞給屬性name的,謝謝!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-06-01 19:50 八進制
    還是不太明白……是指如何顯示在properties view里嗎,只要在descriptions數(shù)組里增加這個屬性,然后在getPropertyValue()和setPropertyValue()方法里處理一下就可以了。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-06-06 20:26 whatisnew
    看了你的照片,又看了你的文章說現(xiàn)在研二,好像是在crl或者csdl實習(xí)過,如果方便,請問您是哪個學(xué)校的?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-06-06 20:34 whatisnew
    your blog is really a big help for these gef beginners, thank u !
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-06-06 23:21 八進制
    您猜得很對。我在Peking University,歡迎交流,頁面左邊有我的郵箱。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-01 17:20 張俊
    八進制,你好。看你的BLOG,是我學(xué)習(xí)GEF的第1步,但是我覺得你沒有講好基礎(chǔ)概念。沒有對目錄結(jié)構(gòu)進行一下說明。
    我在學(xué)習(xí)時,修改你的例子,增加了一個和NODE同級的activity,費了不少事情。當然,如果我用NODE作為基類,就沒那么多麻煩了。但是為了更詳細的了解,我抽象了一個FlowElement去保持連接和位置屬性,結(jié)果遇到了DiagramPart的getChilds的麻煩,activity放不到Diagram中去。呵呵,沒辦法,誰知道AbstractEditPart的refreshChildren()的做法呢,這個是被隱藏的細節(jié)了。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-02 10:19 張俊
    你的Connection沒有使用標準的工廠機制啊。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-02 10:43 張俊
    能不能單獨講解一個GEF的步驟啊:
    創(chuàng)建figure、editPart、editPartFactory、policy、command;
    各個步驟的關(guān)鍵要注意什么,怎么讓GEF知道各個部件的關(guān)系。
    最好是能講一下GEF中,產(chǎn)生一個圖形,創(chuàng)建一個connection時,GEF的調(diào)用過程,比如基類的AbstractGraphicalEditPart有哪些函數(shù)被先后調(diào)用了,那些是GEF包裝的基本實現(xiàn),是可以覆蓋修改的。
    這樣,我們才能知道那些函數(shù)是可以覆蓋的,確切的插入點在哪里。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-02 13:51 八進制
    張俊,這個系列文章陸陸續(xù)續(xù)寫了四五個月,一開始的時候我對gef的很多機制都不了解,所以有些沒搞清楚的概念就沒寫在上面。gef的東西還是挺多的,一兩句說不清(否則我也沒必要寫這么多了),最關(guān)鍵的還是弄清EditPart、EditPolicy,弄清它們的最好辦法是看代碼,比如gef自帶的和我這里提供的幾個。至于調(diào)用過程,在代碼里設(shè)置一些斷點可以很方便的觀察到。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-12 20:35 liuyu
    請問八進制如果我想在Connection不是單純的線段,而是我自己的圖片應(yīng)該怎么做?如果是一般的圖形,我可以用ImageFigure,但是Connection我就不會了。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-13 20:54 八進制
    和普通圖形沒有區(qū)別吧,在你的ConnectionPart里覆蓋createFigure()方法不能實現(xiàn)?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-14 19:34 liuyu
    PolylineConnection conn = new PolylineConnection();

    conn.setConnectionRouter(new ManhattanConnectionRouter());
    conn.setTargetDecoration(new PolygonDecoration());

    這是ConnectionPart里面的createFigure,怎么在conn上加圖片呢?舉個例子吧,謝謝:)
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-15 00:17 八進制
    你是指用圖片作為連接線,還是在連接線上加圖片呢?如果是前者,這里不應(yīng)該用PolylineConnection,可能該用ImageFigure這樣的類型;如果是后者,應(yīng)該用locator實現(xiàn),就像給連接線加箭頭一樣。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-15 10:45 liuyu
    我要的是前者,但是問題是如果用了ImageFigure的話Connection的那些性質(zhì)不就沒有了嗎?比如Connection的拉長、縮短,還有Bendpoint、ManhattanConnectionRouter之類的也不能用了咯?是不是這些東西都要自己去實現(xiàn)阿?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-15 17:38 八進制
    BendPoint和Router肯定不能用了,都不是polyline了啊。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-15 20:03 liuyu
    哦,那要做出漂亮的線真的是困難了。。。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-20 21:15 liuyu
    我看到你的例子里面如果node放在連線上面,連線還是會看得到的,而不會被遮掉,是不是因為Connection的Layer總是在Node所在的Layer上面的?我不想要這樣,我希望如果node放在Connection上面的話能夠把下面的Connection遮掉,就像一個node把另一個node遮掉一樣怎么辦?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-20 22:37 八進制
    可以試試覆蓋ScalableRootEditPart或FreeformGraphicalRootEditPart類(視你在程序用哪個作為RootEditPart而定)的createPrintableLayers()方法,我覺得把兩個layer的順序顛倒一下應(yīng)該就可以了。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-22 14:05 liuyu
    非常感謝,的確換一下順序就能克服這個問題了,現(xiàn)在還有兩個問題想請教:
    第一,如果是同一個Layer的part,比如2個Activity,他們的前后順序好像是按照他們拖放上來的先后順序所決定的吧,后放上來的肯定會把前面放上來的遮掉,有沒有改變這種狀態(tài)呢?還是說無法改變的?
    第二,現(xiàn)在按照你的例子,Activity上的文字都是寫在Activity的中央的,如果我想改變這文字的位置,比如放在Activity的下方應(yīng)該怎么做呢?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-23 00:24 八進制
    第一個問題,是不是可以給用戶一個“把圖形提前”的選項,點它后你讓layer先remove掉這個圖形,再加進來,它就應(yīng)該在最前面了。
    第二個問題,改Activity圖形類即可實現(xiàn)。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-23 20:42 liuyu
    第一個問題的確可以用這個方法解決,第二的問題我還是不會改,現(xiàn)在的代碼里就是直接this.add(label);,這樣的話肯定會加在中央,但是設(shè)置label的location沒有用,始終在Activity的中央,到底應(yīng)該怎么改呢?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-23 22:09 八進制
    label的位置由它所在圖形的layout manager決定
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-24 15:56 liuyu
    我在ActivityFigure里用ToolbarLayout對其進行設(shè)置后,剛把Activity放上去的時候成功了,label的確在圖形下面,但是問題是一拖動圖形label又會跑到圖形中間去了,不知道為什么。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-07-30 13:43 xiaodao
    感覺樓主諄諄教導(dǎo)~!~!~!~!~!~!~!~!~!~!~
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-06 17:05 lucia
    非常感謝你的文章,是我讀的有關(guān)gef里寫得最好的了。我因為剛剛接觸,所以對我現(xiàn)在要編寫的東西還有些迷糊,所以請教一下。我的editor要分成兩個部分,一邊是TreeView, 一邊是顯示節(jié)點和連線,就好像是把大綱視圖嵌入到了editor里。因為他們分別顯示不同的部分,又一一對應(yīng)。你有沒有這方面的例子?我如何才能實現(xiàn)他們呢?

    多謝指教
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-08 20:15 八進制
    應(yīng)該是繼承GraphicalEditorWithFlyoutPalette來實現(xiàn),覆蓋其中的createPartControl()方法把“大綱”加進去,但肯定還有其他工作要做,比如選擇的同步等等,感覺會很麻煩。不如利用perspective把大綱加在Editor的旁邊,如果允許的話。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-10 01:44 lucia
    非常感謝,

    我試過把大綱通過覆蓋createPartControl()的方法加進去,可是沒有成功。我不知道錯在哪里,因為沒有任何出錯信息,但也沒有任何顯示。第二個建議是比較簡單,可是我要建立的是一個gantt chart, 大綱顯示的是任務(wù),我的理想是把大綱嵌入其中。我現(xiàn)在有個折中的辦法,就是任務(wù)不用樹形結(jié)構(gòu)表示,也是用節(jié)點。可問題也不小,如何在瀏覽的時候,將任務(wù)節(jié)點保持不動,我還沒有一點頭緒呢。如果你有什么建議,將感激不盡。


      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-10 18:30 panda
    Does it work GefPractice with eclipse 3.1 and gef 3.1?
    Thank you.
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-10 20:39 八進制
    lucia:gantt圖很麻煩,上一個項目里我們組的大牛花了不少功夫,基本是用draw2d自己實現(xiàn)的。
    panda:GefPractice在eclipse 3.1里運行不起來。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-10 22:53 lucia
    八進制:
    可惜是我的畢業(yè)論文,沒得選擇了,必須完成。我就是覺得用draw2d自己實現(xiàn)實在太麻煩,所以才用gef的。原來打算抄寫ganttproject的開源碼,可是讀那些沒有注釋的code太頭痛,要改的東西太多,才開始另起爐灶的。我實在沒有把握,能不能在一個月內(nèi)編完。因為這只是一部分。

      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-11 06:02 lucia
    打擾了,我能再提個問題嗎?

    我才注意到,EditPart里的getModelChildren只能返回一種類型的children嗎?如果我的模型有的元素有很多類型的children,那該怎么辦呢?多謝指點.
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-11 11:37 八進制
    讓這些children繼承同一個父類
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-11 14:26 lucia
    謝謝你的解答。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-11 17:25 panda
    Thx for your answer yesterday.
    Now i have eclipse 3.0.1 and gef 3.0.1.
    I downloded GefPractice.
    I did:
    file->import->existingtoworkspace
    run as eclipse workbench
    in the new eclipse instance
    file->new->simple project->"gefprac"
    gefprac->new->file->"gefp.gef"

    But it doesn't work. So something goes wrong.

    Could you advice me how i can run gefpractice?

    Thank you.

      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-11 19:26 八進制
    Your file should be named "gefp.gefpractice", not "gefp.gef".
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-11 23:55 panda
    Thank you. It works.
      

    # 請教一個技術(shù)問題 2005-08-15 17:49 freegoldlu
    請教八進制,如何給FreeformLayeredPane 加一個居中的背景圖片 ,
    FreeformLayeredPane中有FreeformLayer
    謝謝!
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-15 20:33 八進制
    給FreeformLayeredPane加一個新層,在這個新層上畫背景圖。
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-16 02:41 lucia
    freegoldlu, 八進制,

    另一種可能性,建立一個新的class,繼承FreeformLayer,覆蓋paintClientArea方法,在這里加入你的背景圖案。我就是這么做的。




      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-20 06:54 lucia
    有關(guān)上次EditPart里的getModelChildren只能返回一種類型的children的問題,想再問一下, 讓這些children繼承同一個父類,可是如果這些children是用不同editpart控制的,怎么辦呢?謝謝
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-20 15:58 八進制
    在你的EditPartFactory里根據(jù)不同子類返回需要的EditPart,不知道你問的是不是這個問題呢?
      

    # re: [Eclipse]GEF入門系列(三、應(yīng)用實例) 2005-08-21 01:51 lucia

    答案找到了,getModelChildren的時候可以將不同類型的children將入到一個list里,就行了。

    我一開始在處理list的時候,沒有新建,而是
    List list = getModel().getChildBs();
    list.addAll(getModel().getChildCs());
    糊涂啊,改成
    List list =new ArrayList(getModel.getChildBs());
    list.addAll(getModel().getChildCs());
    就行了。

    浪費了大家很多時間幫我找錯,真是不安啊。

    多謝了
    posted on 2005-08-26 17:07 sharky的點滴積累 閱讀(2382) 評論(2)  編輯  收藏

    評論

    # re: GEF入門系列(三、應(yīng)用實例) [未登錄] 2008-12-07 00:06 tiger
    你好:
    我把你的程序?qū)胫?為什么運行結(jié)果是eclipse的界面,你能把詳細運行過程說一下嗎  回復(fù)  更多評論
      


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 亚洲6080yy久久无码产自国产| 免费va在线观看| 精品亚洲aⅴ在线观看| a级毛片视频免费观看| 国产a v无码专区亚洲av| 免费一级全黄少妇性色生活片| 免费国产一级特黄久久| 噜噜噜亚洲色成人网站| 国产精品亚洲综合天堂夜夜| 国产成人yy免费视频| 亚洲精品日韩专区silk| 成年人免费的视频| 亚洲fuli在线观看| 免费看韩国黄a片在线观看| 亚洲中文字幕无码mv| 精品国产免费观看久久久| 久久人午夜亚洲精品无码区| 国产青草视频在线观看免费影院| mm1313亚洲国产精品无码试看 | 黄网站色视频免费看无下截| 免费播放特黄特色毛片| 九九全国免费视频| a级亚洲片精品久久久久久久 | 免费在线视频你懂的| 亚洲中文无码线在线观看| 大地资源免费更新在线播放| 亚洲av片在线观看| 免费人成在线观看视频播放| www一区二区www免费| 亚洲AV综合色区无码一区| 在线免费中文字幕| 国产成人亚洲综合一区| 国产免费直播在线观看视频| 一级毛片在线完整免费观看| 亚洲成av人片天堂网| 亚洲免费一级视频| 亚洲人片在线观看天堂无码| 一区二区三区亚洲视频| 国产免费一区二区三区不卡 | 国产一级片免费看| 亚洲视频免费一区|