月蝕傳說

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

          GEF簡(jiǎn)介

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

          2.gif

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

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

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

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


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


          評(píng)論

          # re: GEF簡(jiǎn)介  回復(fù)  更多評(píng)論   

          2007-03-15 19:25 by tacit
          講解很簡(jiǎn)單易懂,太經(jīng)典了,對(duì)于我這樣初學(xué)gef的人而言,受益頗豐。感謝!

          # re: GEF簡(jiǎn)介  回復(fù)  更多評(píng)論   

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

          # re: GEF簡(jiǎn)介[未登錄]  回復(fù)  更多評(píng)論   

          2007-05-15 16:04 by vivi
          講得挺好的,但是為什么看不到圖片呢?
          主站蜘蛛池模板: 吉水县| 翁源县| 崇礼县| 上虞市| 离岛区| 红原县| 同心县| 靖江市| 兴国县| 嘉祥县| 青州市| 辉南县| 五台县| 宾川县| 蒙城县| 桦川县| 太谷县| 湘潭县| 贵溪市| 峨山| 厦门市| 平泉县| 万盛区| 东山县| 临朐县| 基隆市| 吉安市| 海南省| 淳化县| 调兵山市| 德保县| 大竹县| 吉隆县| 赤城县| 安吉县| 启东市| 阜新市| 晋中市| 永登县| 监利县| 武鸣县|