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

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

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

    月蝕傳說

    浮躁讓人失去理智
    posts - 25, comments - 101, trackbacks - 0, articles - 0
      BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    GEF簡介

    Posted on 2006-10-09 18:55 Dart 閱讀(3054) 評論(3)  編輯  收藏 所屬分類: GEF
    GEF(Graphical Editing Framework )是Eclipse旗下的強有力的Tool Project,利用GEF可以輕松實現類似于Visual Editor的可視化圖形編輯應用程序。
    我將以如何構建一個數據庫編輯工具為力,介紹一下GEF
    ?
    1.什么是GEF。EditPartViewer
    上面已經說過了,GEF是Eclipse旗下的Tool Project,為開發者提供了一個圖形編輯開發平臺。GEF是一個很出色的MVC平臺,見下圖:
    ?

    2.gif

    ?
    ?EditPartViewer是用于承載圖形的,就像一張畫布一樣,但是并不是直接講圖像繪制在其之上,而是通過GEF的EditPart來獲得的圖形,這里只是介紹一下,下面會進行講解,但是涉及到EditPartViewer本身的東西比較少。
    2.Model?, EditPart ,View
    模型(model)是開發者自己根據自身程序的要求而定制的,它包括了開發者所想在程序中展現的一些信息,比如我們創建數據庫編輯工具,那么我們的模型中就會有數據表(DataTable)這么一個模型,一個完整的數據表就會擁有自己的表名(name)、列(Column)、元組(Row)、主鍵(Key)等屬性。這些屬性對于一個數據表來說是必須的,只有這些屬性才能完整地去描述一個數據表。
    此外,在GEF中,模型有時候還需要一些附屬屬性,我們姑且這些屬性為“圖形屬性”,這些屬性和模型本身是沒有什么關系的,只是為了反應模型對應的視圖(View)的一些變化而設置的,比如坐標、尺寸等。
    模型的變化需要反應在視圖上,典型的MVC是通過控制器來改變視圖的,在GEF中稱控制器為“編輯單元”(EditPart),編輯單元和模型是一對一的關系。
    編輯單元是架起模型是試圖的一道橋梁,模型的改變會觸發事件,讓EditPart更新目前的視圖,視圖會根據模型的屬性改變而做出響應的調整,當然這些調整都是開發人員自己規定的了。簡單的做法是,在模型中設置一個屬性更改發起源:java.bean.PropertieSource,然后讓編輯單元 (EditPart)實現監聽器:java.bean.PropertiesChangeListener,這樣一來,每當模型變化的時候,就會發出變化通知,編輯單元得到通知后,刷新視圖。但是這種做法不是很好,一般情況下,開發人員都應該利用EMF(Eclipse旗下的另一個 Toolproject)進行建模,然后利用EMF模型的屬性通知功能來實現事件通知以及響應。
    而當視圖發生變化的時呢?廣告之后馬上回來(我抽根煙先)
    ?
    3. Request 和 Policy
    視圖變化發出的事件,其實是開發人員所不能控制的,我這么說并不是指無法控制,而是想引出下一個問題:Request和Policy
    費了半天話,我開始進入正題了。各位觀眾請注意,這一節很重要。
    其實GEF的MVC模式中,在利用控制器去改變模型的時候,利用了策略模式(Policy)。這里需要說一下GEF中如何進行對圖形變化的事件處理。
    在GEF 構架中,圖形的變化并不是像通常的控件那樣,利用添加監聽器來回調函數,它是把這些事件都封裝成了一個個的Request向外發送,然后讓 EditPart來截獲處理。維護這些事件,并將他們封裝成Request的是一個叫EditDomain的家伙,在這里不做介紹,只要知道有這么一個東西就行了,在以后的文章里面會慢慢提起它。
    EditPart怎么處理Request?很簡單,寫代碼唄!舉個例子:當我們在圖形上做了一個點擊操作,點了一下某一個圖形,這時候,EditPartViewer就會截獲事件,傳給EditDomain,然后將信息封裝生成一個Reuqest,傳遞到EditPart那里,讓它處理。下面是事件方向:

    http://album.sina.com.cn/pic/5414465b0200041b

    怎么處理呢?如果我們點擊后要高亮顯示這個圖片,或者是在圖片四周形成一個黑色的邊框,那怎么辦?寫代碼嗎?不用,有人會去做,它就是Policy。見圖:
    下面請Policy登場。
    Policy 能夠對這些Request進行一些基本的處理,比如上述的那樣,一些Policy能夠處理當我們選中一個圖形后所產生的高亮效果等,不僅僅如此,還比如拖動圖形、拉伸圖形以及繪制圖形等等操作,都是由Policy來處理的,可以毫不客氣地說,Policy比EditPart有用多了!
    Policy 是被EditPart“安裝”到自己身上的,利用EditPart的instanllEditPartPolicy方法,將一些相關的Policy“安裝”好,好讓他們處理Request。EditPart所需要安裝的Policy是有不同的,這是由于Request有多種“角色”,不同的角色是不同事件封裝的結果,只有對應的Policy才能對他們處理,這里記住,Policy和Request是多-多的關系,不同的Policy能夠處理同一個 Request。
    但是Policy卻又什么都不能做,這是由于很多代碼還是需要程序員來寫的,Policy 只處理一些基本東西(上面提到的現實黑色邊框什么的),然后它又會通過Request“索取”Command,然后再執行Command。好了,我不廢話了,這里大家只要了解下就可以了,以后會慢慢講清楚Policy,記住Policy很重要。

    http://album.sina.com.cn/pic/5414465b0200041c


    4.Command 和 CommandStack
    從上圖可以看到有一個名位Command的東東,下面說說它。
    Command,顧名思義,方法,它是一個簡單的類,需要開發人員去實現它的一些方法,最常用的方法有:excute,redo,undo。這三個方法非別是執行、重新執行、取消執行,Policy索取到Command后會去執行它的excute方法,所以說開發人員必須清楚地去理解Policy所要Command的含義(它是一個什么樣的Command?是添加一個模型的,還是更改圖形位置的),以及觸發的時機。
    兩個方法redo,undo是為了實現取消、回滾操作而設定的方法。說到Command,就不能提到CommandStack(方法棧),它維護了一系列的Command,從而實現了回滾、前進等操作,而這個方法棧又是由Domain進行維護的。
    ?
    5. Draw2D 和 Figure
    Draw2D是在SWT之上的,GEF的圖形實現就是利用了Draw2D。這里不做太多介紹,在以后的文章里面,我會有很多的地方要提到它
    關于Figure這里就不廢話了,來日方長嘛!睡覺!
    6.結束語
    這里只是簡單介紹了一下GEF的大致情況,下一章我講會講一下具體的實現


    評論

    # re: GEF簡介  回復  更多評論   

    2007-03-15 19:25 by tacit
    講解很簡單易懂,太經典了,對于我這樣初學gef的人而言,受益頗豐。感謝!

    # re: GEF簡介  回復  更多評論   

    2007-03-16 09:14 by Dart
    哎,現在我才發現我的這篇文章漏洞百出,希望各位讀者多指出錯誤,并且僅以此文章作為參考,文章上的一些說法并非完全正確,特此聲明

    # re: GEF簡介[未登錄]  回復  更多評論   

    2007-05-15 16:04 by vivi
    講得挺好的,但是為什么看不到圖片呢?
    主站蜘蛛池模板: 亚洲AV无码一区二区乱子伦| 国产午夜亚洲精品午夜鲁丝片| 337p日本欧洲亚洲大胆艺术| 久久久久久成人毛片免费看| 亚洲AV人无码激艳猛片| 久久国产高潮流白浆免费观看| 久久亚洲AV成人出白浆无码国产| 57pao国产成视频免费播放| 91亚洲精品自在在线观看| 无码中文字幕av免费放| 亚洲国产无线乱码在线观看| 免费一级做a爰片性色毛片| eeuss影院免费直达入口| 亚洲A∨无码无在线观看| 国产人成免费视频网站| 激情五月亚洲色图| 免费A级毛片在线播放不收费| 爱情岛论坛免费视频| 国产亚洲日韩在线三区| 精品无码无人网站免费视频| 亚洲一区精彩视频| 亚洲毛片av日韩av无码| 全部免费毛片在线播放| 亚洲日韩AV无码一区二区三区人| 免费h成人黄漫画嘿咻破解版| aa级毛片毛片免费观看久| 亚洲色图.com| 在线观看亚洲免费| 国产无遮挡裸体免费视频在线观看 | 天堂在线免费观看中文版| 美美女高清毛片视频黄的一免费| 亚洲一区无码精品色| 蜜桃视频在线观看免费视频网站WWW| 亚洲人成网站18禁止久久影院| 免费a在线观看播放| 中文字幕免费视频| 猫咪免费人成在线网站| 亚洲五月六月丁香激情| 免费国产在线观看不卡| 91青青青国产在观免费影视| 美女又黄又免费的视频|