首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

GEF 入門系列(二):GEF 架構概覽

     編輯:Java 相關知識

前文提到,GEF(Graphical Editor Framework)是圖形化編輯框架,允許開發人員以圖形化方式展示和編輯模型,提升用戶體驗。典型應用:UML 類圖編輯器、圖形化 XML 編輯器、界面設計工具、圖形化數據庫結構設計工具等。歸納發現它們在圖形化編輯方面有以下共同點:

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

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

GEF 發展歷程

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

先概括介紹 GEF 各組成部分,後續結合例子詳細說明。

圖2 GEF 結構圖

模型

GEF 模型只與控制器打交道,不知任何視圖相關東西。為讓控制器知道模型變化,應把控制器作為事件監聽者註冊在模型中,模型變化時觸發相應事件給控制器,後者通知各視圖更新。典型模型對象含 PropertyChangeSupport 類型成員變數,維護監聽器即控制器;對具有連接關係的模型,維護連入/連出連接列表;若模型對應節點有大小位置資訊,也維護它們。這些變數非模型本身必須資訊,維護它們使模型不夠清晰,但可通過構造抽象模型類(如讓所有有連接的模型對象繼承 Node 類)維持可讀性。相對來說模型是 MVC 中最簡單部分。

控制器

MVC 中控制器是模型與視圖間橋梁,也是 GEF 核心。它不僅監聽模型變化,用戶編輯視圖時,還要把編輯結果反映到模型。例如用戶在數據庫結構圖刪除一個表,控制器應從模型刪除此表對象、表中字段對象、及與這些對象相關所有連接。在 GEF 中這些操作非直接由控制器完成,稍後說明。

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

RootEditPart 是特殊 EditPart,與模型無關,作用是把 EditPartViewer 和 contents(應用最上層 EditPart,一般代表畫布)關聯起來,可視為 contents 容器。EditPartViewer 有 setRootEditPart() 專門指定視圖對應的 RootEditPart。

圖3 EditPart 對象

用戶編輯操作被轉換為一系列請求(Request),有很多種類,在 GEF 中稱為角色(Role)。GEF 有圖形化和非圖形化兩大類角色,前者如 Layout Role 對應佈局相關操作,後者如 Connection Role 對應連接相關操作等。角色概念通過編輯策略(EditPolicy)實現,EditPolicy 主要功能是根據請求創建相應命令(Command),後者直接操作模型對象。對每個 EditPart,可「安裝」一些 EditPolicy,用戶對此 EditPart 特定操作會被交給已安裝對應 EditPolicy 處理。直接好處是可在不同 EditPart 間共享重複操作。GEF SDK 幫助文檔有詳細 EditPolicy、Role 和 Request 類型列表,不贅述。

視圖

GEF 視圖可有很多種,目前提供圖形(GraphicalViewer)和樹狀(TreeViewer)兩種,前者利用 Draw2D 圖形(IFigure)表現,多用於編輯區域,後者多用於大綱展示。視圖任務同樣繁重,除模型顯示功能外,還要提供編輯功能、回顯(Feedback)、工具提示(ToolTip)等。

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

EditPartViewer 同時也是 ISelectionProvider,用戶在編輯區做選擇操作時,註冊的 SelectionChangeListener 可收到選擇事件。EditPartViewer 維護各 EditPart 選中狀態,若無被選中 EditPart,缺省選中作為 contents 的 EditPart。

典型 GEF 應用程序樣貌

大部分 GEF 應用實現為 Eclipse Editor,編輯區域放在 Editor(如 GraphicalEditorWithPalette)裡。典型 GEF 應用具有一個圖形編輯區域包含在 Editor 裡,可能有大綱視圖和屬性頁,一個創建 EditPart 實例的 EditPartFactory,一些表示業務的模型對象,與模型對應的 EditPart,每個 EditPart 對應一個 IFigure 子類對象顯示給用戶,一些 EditPolicy 對象,以及一些 Command 對象。

GEF 應用工作方式:EditPartViewer 接受用戶操作(節點選擇、新增刪除等),每個節點對應一個 EditPart,此對象有一組按操作 Role 分開的 EditPolicy,每個 EditPolicy 對應一些 Command,Command 最終直接修改模型。用戶操作轉換為 Request 分配給適當 EditPolicy,由後者創建適當 Command 修改模型,這些 Command 保留在 EditDomain(專門維護 EditPartViewer、Command 等資訊對象,一般每個 Editor 對應唯一一個)命令堆棧裡,用於實現撤銷/重做。

以上介紹 GEF 中重要概念,不知看後是否有大概印象。沒有也沒關係,後續將有結合例子講解,使用實例即序言提到的第六個專案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved