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

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

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

    sharky的點滴積累

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

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

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

    圖1 Practice Editor的使用界面

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    評論

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

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

    # re: [Eclipse]GEF入門系列(三、應用實例) 2005-02-25 01:46 郭奕
    您好,首先謝謝您答復我。因為最近導師讓我做流程驗證的程序,所以又有幾個問題要麻煩您。
    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里面并沒有出現預期的ComboBox的結果,究竟是什么原因呢?
    2.如果我有了不同類型的Node,比如正方形的Node和圓形的Node,應該繼承Node類新建兩個子類還是作為Node的屬性呢?是否一個模型可以對應多個IFigure類呢?
    由于我本行不是編程,所以用GEF很困難,有些概念還不是那么清楚,請您抽出寶貴時間,幫我解答。萬分感謝!
      

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

    # re: [Eclipse]GEF入門系列(三、應用實例) 2005-02-28 04:32 郭奕
    謝謝你的解答。我最近一直在看這個例子。對GEF也有了一些初步的了解。我也對比了另外一個例子epctools,不知道你用過沒有?如果需要我可以給你下載的連接地址。
    感覺這個例子好的地方在于:
    1。Model層中將model的通知機制抽象出來,代碼更OO;
    2。Node由于實現了IPropertySource,可以在propertyView中即時修改Node的屬性。
    不好的地方(也可能是很好,但是我不太懂地方)
    1。Node節點沒有實現IPropertySource的接口;
    2。Node沒有子類,我試著擴展了Node,NodePart的createfigure也根據類型的不同進行了修改;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.節點分為Activity(方的)、Control(圓的);
    2. 通過算法(已經完成)找到圖中的arbitary cycle (block),每一個合法cycle用復雜節點表示(可以展開).
    我要把epcTools這個例子改一改。
    有興趣的話可以看看這個基于GEF的EpcTools的例子。
    http://wwwcs.upb.de/cs/kindler/Forschung/EPCTools/download.html
    再次謝謝你給予的無私的幫助!
      

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

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

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

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

    # re: [Eclipse]GEF入門系列(三、應用實例) 2005-03-02 06:26 郭奕
    運行logic的sourceCode那個問題已經解決了。謝謝。要在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入門系列(三、應用實例) 2005-03-03 10:46 八進制
    抱歉,最近比較忙,接下來的文章得過一段時間再續寫了。
      

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

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

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

      

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

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

    # re: [Eclipse]GEF入門系列(三、應用實例) 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引用的問題應該可以通過修改plugin.xml文件改好的。
      

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

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

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

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

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

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

    # re: [Eclipse]GEF入門系列(三、應用實例) 2005-05-23 22:16 八進制
    不好意思,今天一天都沒連上這里,現在剛看到你的留言。你可以把那個工程(大小不要超過1M)發到我郵箱里我幫你看看什么問題。
      

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    多謝指教
      

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

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

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


      

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

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

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

      

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

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

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

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

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

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

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

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

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

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




      

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

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

    # re: [Eclipse]GEF入門系列(三、應用實例) 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入門系列(三、應用實例) [未登錄] 2008-12-07 00:06 tiger
    你好:
    我把你的程序導入之后,為什么運行結果是eclipse的界面,你能把詳細運行過程說一下嗎  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 永久在线观看免费视频| 丁香六月婷婷精品免费观看| 91精品导航在线网址免费| 亚洲精品成人网站在线观看| 又硬又粗又长又爽免费看 | 亚洲中文字幕久久精品无码VA| 中国xxxxx高清免费看视频| 亚洲精品午夜久久久伊人| 国产免费一区二区三区| 亚洲三级在线免费观看| 精品少妇人妻AV免费久久洗澡| 最近免费中文字幕大全免费 | 在线A级毛片无码免费真人| 伊人久久五月丁香综合中文亚洲| 在线观看免费为成年视频| 在线观看亚洲网站| 国产L精品国产亚洲区久久| 任你躁在线精品免费| 亚洲欧洲日韩国产综合在线二区| 久视频精品免费观看99| 在线a亚洲老鸭窝天堂av高清| 全部免费国产潢色一级| 二个人看的www免费视频| 久久久久亚洲av无码尤物| 免费福利在线播放| 亚洲av综合日韩| 免费看黄视频网站| 亚洲精品无码专区在线播放| 亚洲av无码国产精品色在线看不卡 | 亚洲精品无码av天堂| 久久免费国产视频| 亚洲人成7777| 亚洲精品国产va在线观看蜜芽| 免费国产叼嘿视频大全网站| 男人天堂2018亚洲男人天堂| 免费观看无遮挡www的视频 | 在线免费观看亚洲| 免费v片在线观看无遮挡| 免费人成网站在线观看不卡| 亚洲日本在线电影| 亚洲精品乱码久久久久久中文字幕|