<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(Graphical Editor Framework)是一個圖形化編輯框架,它允許開發人員以圖形化的方式展示和編輯模型,從而提升用戶體驗。這樣的應用程序有很多,例如:UML類圖編輯器、圖形化XML編輯器、界面設計工具以及圖形化數據庫結構設計工具等等。歸結一下,可以發現它們在圖形化編輯方面具有以下共同之處:

    • 提供一個編輯區域和一個工具條,用戶在工具條里選擇需要的工具,以拖動或單擊的方式將節點或連接放置在編輯區域;
    • 節點可以包含子節點;
    • 用戶能夠查看和修改某個節點或連接的大部分屬性;
    • 連接端點錨定在節點上;
    • 提供上下文菜單和鍵盤命令;
    • 提供圖形的縮放功能;
    • 提供一個大綱視圖,顯示編輯區域的縮略圖,或是樹狀模型結構;
    • 支持撤消/重做功能;
    • 等等。

     
    圖1 基于GEF的界面設計工具(Visual Editor,VE)的工作界面

    GEF最早是Eclipse的一個內部項目,后來逐漸轉變為Eclipse的一個開源工具項目,Eclipse的不少其他子項目都需要它的支持。Eclipse 3.0版本花了很大功夫在從Platform中剝離各種功能部件上,包括GEF和IDE在內的很多曾經只能在Eclipse內部使用的工具成為可以獨立使用的軟件/插件包了。理論上我們是可以脫離Eclipse用GEF包構造自己的應用程序的,但由于它們之間天然的聯系,而且Eclipse確實是一個很值得支持的開發平臺,所以我還是推薦你在Eclipse中使用它。

    GEF的優勢是提供了標準的MVC(Model-View-Control)結構,開發人員可以利用GEF來完成以上這些功能,而不需要自己重新設計。與其他一些MVC編輯框架相比,GEF的一個主要設計目標是盡量減少模型和視圖之間的依賴,好處是可以根據需要選擇任意模型和視圖的組合,而不必受開發框架的局限(不過實際上還是很少有脫離Draw2D的實現)。

    現在來看看GEF是如何實現MVC框架的吧,在這個帖子里我們先概括介紹一下它的各個組成部分,以后將結合例子進行更詳細的說明。


    圖2 GEF結構圖

    模型:GEF的模型只與控制器打交道,而不知道任何與視圖有關的東西。為了能讓控制器知道模型的變化,應該把控制器作為事件監聽者注冊在模型中,當模型發生變化時,就觸發相應的事件給控制器,后者負責通知各個視圖進行更新。

    典型的模型對象會包含PropertyChangeSupport類型的成員變量,用來維護監聽器成員即控制器;對于與其他對象具有連接關系的模型,要維護連入/連出的連接列表;如果模型對應的節點具有大小和位置信息,還要維護它們。這些變量并不是模型本身必須的信息,維護它們使模型變得不夠清晰,但你可以通過構造一些抽象模型類(例如讓所有具有連接的模型對象繼承Node類)來維持它們的可讀性。

    相對來講GEF中模型是MVC中最簡單的一部分。

    控制器:我們知道,在MVC結構里控制器是模型與視圖之間的橋梁,也是整個GEF的核心。它不僅要監聽模型的變化,當用戶編輯視圖時,還要把編輯結果反映到模型上。舉個例子來說,用戶在數據庫結構圖上刪除一個表時,控制器應該從模型中刪除這個表對象、表中的字段對象、以及與這些對象有關的所有連接。當然在GEF中這些操作不是由直接控制器完成的,這個稍后就會說到。

    GEF中的控制器是所謂的EditPart對象,更確切的說應該是一組EditPart對象共同組成了GEF的控制器這部分,每一個模型對象都對應一個EditPart對象。你的應用程序中需要有一個EditPartFactory對象負責根據給定模型對象創建對應的EditPart對象,這個工廠類將被視圖利用。

    RootEditPart是一種特殊的EditPart,它和你的模型沒有任何關系,它的作用是把EditPartViewer和contents(應用程序的最上層EditPart,一般代表一塊畫布)聯系起來,可以把它想成是contents的容器。EditPartViewer有一個方法setRootEditPart()專門用來指定視圖對應的RooEditPart。


    圖3 EditPart對象

    用戶的編輯操作被轉換為一系列請求(Request),有很多種類的請求,這些種類在GEF里被稱為角色(Role),GEF里有圖形化和非圖形化這兩大類角色,前者比如Layout Role對應和布局有關的的操作,后者比如Connection Role對應和連接有關的操作等等。角色這個概念是通過編輯策略(EditPolicy)來實現的,EditPolicy的主要功能是根據請求創建相應的命令(Command),而后者會直接操作模型對象。對每一個EditPart,你都可以"安裝"一些EditPolicy,用戶對這個EditPart的特定操作會被交給已安裝的對應EditPolicy處理。這樣做的直接好處是可以在不同EditPart之間共享一些重復操作。

    在GEF SDK提供的幫助文檔(GEF開發指南)里有一份詳細的EditPolicy、Role和Request類型列表,這里就不贅述了。

    視圖:前面說過,GEF的視圖可以有很多種,GEF目前提供了圖形(GraphicalViewer)和樹狀(TreeViewer)這兩種,前者利用Draw2D圖形(IFigure)作為表現方式,多用于編輯區域,后者則多用于實現大綱展示。視圖的任務同樣繁重,除了模型的顯示功能以外,還要提供編輯功能、回顯(Feedback)、工具提示(ToolTip)等等。

    GEF使用EditPartViewer作為視圖,它的作用和JFace中的Viewer十分類似,而EditPart就相當于是它的ContentProvider和LabelProvider,通過setContents()方法來指定。我們經常使用的Editor是一個GraphicalEditorWithPalette(GEF提供的Editor,是EditorPart的子類,具有圖形化編輯區域和一個工具條),這個Editor使用GraphicalEditViewer和PaletteViewer這兩個視圖類,PaletteViewer也是GraphicalEditViewer的子類。開發人員要在configureGraphicalViewer()和initializeGraphicalViewer()這兩個方法里對EditPartViewer進行定制,包括指定它的contents和EditPartFactory等等。

    EditPartViewer同時也是ISelectionProvider,這樣當用戶在編輯區域做選擇操作時,注冊的SelectionChangeListener就可以收到選擇事件。EditPartViewer會維護各個EditPart的選中狀態,如果沒有被選中的EditPart,則缺省選中的是作為contents的EditPart。

    初步了解了GEF的MVC實現方式,讓我們看看典型的GEF應用程序是什么樣子的。大部分GEF應用程序都實現為Eclipse的Editor,也就是說整個編輯區域是放置在一個Editor里的。所以典型的GEF應用程序具有一個圖形編輯區域包含在一個Editor(例如GraphicalEditorWithPalette)里,可能有一個大綱視圖和一個屬性頁,一個用于創建EditPart實例的EditPartFactory,一些表示業務的模型對象,與模型對象對應的一些EditPart,每個EditPart對應一個IFigure的子類對象顯示給用戶,一些EditPolicy對象,以及一些Command對象。

    GEF應用程序的工作方式如下: EditPartViewer接受用戶的操作,例如節點的選擇、新增或刪除等等,每個節點都對應一個EditPart對象,這個對象有一組按操作Role分開的EditPolicy,每個EditPolicy會對應一些Command對象,Command最終對模型進行直接修改。用戶的操作轉換為Request分配給適當的EditPolicy,由后者創建適當的Command來修改模型,這些Command會保留在EditDomain(專門用于維護EditPartViewer、Command等信息的對象,一般每個Editor對應唯一一個該對象)的命令堆棧里,用于實現撤消/重做功能。

    以上介紹了GEF中一些比較重要的概念,不知道看過之后你是否對它有了一個大概的印象。如果沒有也沒關系,因為在后面的帖子里將會有結合例子的講解,我們使用的實例就是序言里提到的第六個項目。

    參考資料:

    • GEF開發指南
    • Eclipse Development - Using the Graphical Editing Framework and the Eclipse Modeling Framework
    posted on 2005-02-13 15:21 八進制 閱讀(2155) 評論(11)  編輯 收藏 收藏至365Key 所屬分類: Eclipse

    評論

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-02-18 19:01 郭奕
    寫得很好,很清楚。比redbook好多了。繼續!期盼中。。。謝謝。
      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-02-18 23:32 八進制
    不用客氣啦,還請多提意見。
      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-03-07 12:32 howjay
    “大部分GEF應用程序都實現為Eclipse的Editor,也就是說整個編輯區域是放置在一個Editor里的。”

    意思是基本上都要Eclipse的支持嗎?我用過VE,UML的畫圖,確實是需要Eclipse的。那能不能脫離Eclipse呢?
      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-04-07 20:15 Tim
    hi, 請問哪里可以搞到"GEF開發指南"呢?如果你手上有的話,發一份給我好嗎:woobeen@msn.com,謝謝!
      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-04-07 22:49 八進制
    帖子里說的開發指南是GEF幫助,“GEF Developer Guide”,安裝GEF以后在Eclipse幫助里就可以看到。
      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-08-25 16:47 sawxb
    十分感謝八進制的blog,更要感謝八進制,在這里我學會了很多東西,幾乎是你在寫到這片文章的時候我剛剛開始學習GEF,中文資料幾乎沒有,我完全是在你的這些文章的幫助下學習的GEF。現在剛剛畢業,公司也不算很忙,打算深入的研究一下GEF。
    上次在你的指點下,很快就把問題解決了,而且是在幾個小時后就幫我解答了,真是神速啊,太強了。

    請問八進制,在model包中Element類中的

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    listeners = new PropertyChangeSupport(this);
    }
    這個方法具體事做什么的,我看好像沒有地方需要這個東西啊,麻煩你幫我看一下,先謝謝了。
      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-08-25 17:10 八進制
    你說的是哪個model包,應該不是gef里的吧?
      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-08-25 18:29 sawxb
    subject 項目中的

      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-08-25 18:33 sawxb
    是GEF中的,就是你編寫的subject 項目實例中的 model包中 Element 類 中的方法
      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-08-25 20:57 八進制
    看到了,這個方法是以前方便序列化/反序列化用的,現在已經不用了,呵呵。
    在Eclipse里查找它的reference就會發現沒有任何類使用到它。
      

    # re: [Eclipse]GEF入門系列(二、GEF概述) 2005-08-25 21:39 sawxb
    謝謝,八進制!!在以前,我都是只看代碼,所以現在想從頭自己研究一下GEF,以便徹底搞清楚GEF這東西。

    posted on 2005-08-26 17:06 sharky的點滴積累 閱讀(602) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: AA免费观看的1000部电影| 永久免费av无码入口国语片| 国产免费的野战视频| 久久99国产亚洲精品观看| 任你躁在线精品免费| 亚洲精品乱码久久久久久久久久久久| 三上悠亚电影全集免费 | 日本免费网址大全在线观看| 婷婷亚洲久悠悠色悠在线播放| 久久aⅴ免费观看| 亚洲福利视频网站| 野花高清在线电影观看免费视频| 亚洲入口无毒网址你懂的| 天天摸夜夜摸成人免费视频| 亚洲av日韩精品久久久久久a| 国产伦一区二区三区免费| 青青免费在线视频| 中文亚洲AV片在线观看不卡| 国产精品区免费视频| 亚洲第一永久在线观看| 好吊妞在线新免费视频| yellow视频免费看| 久久综合日韩亚洲精品色| 四虎在线最新永久免费| 亚洲精品无码久久久久秋霞| 成人亚洲综合天堂| 日韩视频免费在线观看| 亚洲成A∨人片在线观看无码| 成人免费视频一区| 一本一道dvd在线观看免费视频| 亚洲2022国产成人精品无码区 | 十八禁视频在线观看免费无码无遮挡骂过 | 亚洲中文字幕日产乱码高清app| 久久免费观看国产99精品| 亚洲中字慕日产2021| 又粗又大又猛又爽免费视频| A级毛片高清免费视频在线播放| 亚洲av无码片在线观看| 亚洲精品无码AV中文字幕电影网站| 久久免费观看国产精品88av| 亚洲精品乱码久久久久久蜜桃图片 |