GEF以前學(xué)習(xí)過, 而且還按照Dudu的教程做了一遍, 在網(wǎng)上也找了不少資料, 不錯(cuò)的文章也轉(zhuǎn)載了不少,只不過當(dāng)時(shí)對(duì)插件開發(fā)還只是一知半解, 對(duì)圖形開發(fā)更是沒有什么概念,導(dǎo)致的直接后果就是:現(xiàn)在基本上全部忘記光了,于是不得不從頭開始,不過這次不僅要知其然, 而且還要知其所以然, 不過理解起來還是比較快的, 不知是拖以前學(xué)習(xí)的底子的福, 還是因?yàn)檫@么長(zhǎng)時(shí)間做Eclipse開發(fā)來的基礎(chǔ)
在理想的情況下,命令應(yīng)當(dāng)只知道模型。因此應(yīng)當(dāng)盡量避免對(duì)EditPart和圖形的引用。
圖形(Figure)不應(yīng)該去訪問EditPart和Model, 即使Figure要引用EditPart, EditPart也只是作為一個(gè)Listner來被應(yīng)用,而不是直接去引用一個(gè)EditPart
一個(gè)Model實(shí)例會(huì)對(duì)應(yīng)一個(gè)EditPart, 因?yàn)镋ditPart會(huì)隨著Model的存在而存在, 而model隨時(shí)可能被刪除, 所以在EditPart中應(yīng)盡量少包含一些長(zhǎng)效信息,而且應(yīng)該避免Command去引用EditPart
EditPart的refreshVisuals()方法只會(huì)在其初始化的時(shí)候被自動(dòng)調(diào)用,如果model發(fā)生變化,需要更新圖形界面時(shí),必須手動(dòng)調(diào)用refreshVisuals()方法.
連接(connection)是通過source和target連接點(diǎn)來獲取的, 而且connection的EditPart只會(huì)創(chuàng)建一次, connection也是一種圖形,它必須通過ConnectionAnchor掛在另外兩個(gè)圖形上面,因此必須告訴connection它所需要的兩個(gè)anchor在哪里, 默認(rèn)情況GEF會(huì)通過給連接圖形的EditPart實(shí)現(xiàn)NodeEditPart接口來提供所需要的anchor, 這樣做一個(gè)是因?yàn)閍nchor是與連接圖形關(guān)聯(lián)的,而連接在開始的時(shí)候是不知道anchor在哪里的, 另一個(gè)原因是, 當(dāng)用戶創(chuàng)建一個(gè)connnection的時(shí)候, Connection EditPart還沒有被創(chuàng)建
EditPart通過監(jiān)聽器來獲得模型的修改,并提供方法去刷新視圖, 比如子節(jié)點(diǎn)被刪除,將調(diào)用refreshChildren()方法去刪除子節(jié)點(diǎn)對(duì)應(yīng)的圖形和EditPart, 如果只是屬性發(fā)生變化,那么將調(diào)用refreshVisuals()方法, 因?yàn)樵摲椒〞?huì)頻繁調(diào)用,因此在調(diào)用前應(yīng)該做一些判斷來避免不必要的刷新
一般在active()方法中添加listener, deactive()中刪掉這些添加的listener,
在EditPart中, 由圖形修改導(dǎo)致模型修改是通過command來實(shí)現(xiàn), 而模型修改導(dǎo)致圖形修改則是通過listener來實(shí)現(xiàn)
EditPart是GEF的核心, 對(duì)于一個(gè)可編輯的模型元素都必須有一個(gè)對(duì)應(yīng)的EditPart類對(duì)應(yīng), 在EditPart中有兩個(gè)容易混淆的方法:getModelChildren()返回包含在當(dāng)前模型中的子模型, getChildren()返回子模型對(duì)應(yīng)的EditPart
如果父圖形不是子圖形的直接父親, 那么需要實(shí)現(xiàn)AbstractGraphicalEditPart.getContentPane()方法, 得到的對(duì)象將用來存放所有的子圖形
當(dāng)用戶在圖形編輯器中執(zhí)行操作的時(shí)候, GEF在內(nèi)部會(huì)創(chuàng)建相應(yīng)的Request, 比如新建一個(gè)對(duì)象將生成CreateRequest, 它包含了新建對(duì)象的模型實(shí)例, 用來存放該Request的EditPart
對(duì)于我們的EditPolicy實(shí)現(xiàn)來說, 我們要做的大部分工作就是根據(jù)request創(chuàng)建一個(gè)Comamnd對(duì)象, Command子類一般要實(shí)現(xiàn)execute和undo方法,execute方法就是用來將圖形的改變更新到模型上, Command更多的是對(duì)模型的依賴, 而跟GEF其他的組件沒有什么關(guān)系, 比如絕對(duì)不會(huì)去引用EditPart和EditPolicy實(shí)例
在理想的情況下,命令應(yīng)當(dāng)只知道模型。因此應(yīng)當(dāng)盡量避免對(duì)EditPart和圖形的引用。
圖形(Figure)不應(yīng)該去訪問EditPart和Model, 即使Figure要引用EditPart, EditPart也只是作為一個(gè)Listner來被應(yīng)用,而不是直接去引用一個(gè)EditPart
一個(gè)Model實(shí)例會(huì)對(duì)應(yīng)一個(gè)EditPart, 因?yàn)镋ditPart會(huì)隨著Model的存在而存在, 而model隨時(shí)可能被刪除, 所以在EditPart中應(yīng)盡量少包含一些長(zhǎng)效信息,而且應(yīng)該避免Command去引用EditPart
EditPart的refreshVisuals()方法只會(huì)在其初始化的時(shí)候被自動(dòng)調(diào)用,如果model發(fā)生變化,需要更新圖形界面時(shí),必須手動(dòng)調(diào)用refreshVisuals()方法.
連接(connection)是通過source和target連接點(diǎn)來獲取的, 而且connection的EditPart只會(huì)創(chuàng)建一次, connection也是一種圖形,它必須通過ConnectionAnchor掛在另外兩個(gè)圖形上面,因此必須告訴connection它所需要的兩個(gè)anchor在哪里, 默認(rèn)情況GEF會(huì)通過給連接圖形的EditPart實(shí)現(xiàn)NodeEditPart接口來提供所需要的anchor, 這樣做一個(gè)是因?yàn)閍nchor是與連接圖形關(guān)聯(lián)的,而連接在開始的時(shí)候是不知道anchor在哪里的, 另一個(gè)原因是, 當(dāng)用戶創(chuàng)建一個(gè)connnection的時(shí)候, Connection EditPart還沒有被創(chuàng)建
EditPart通過監(jiān)聽器來獲得模型的修改,并提供方法去刷新視圖, 比如子節(jié)點(diǎn)被刪除,將調(diào)用refreshChildren()方法去刪除子節(jié)點(diǎn)對(duì)應(yīng)的圖形和EditPart, 如果只是屬性發(fā)生變化,那么將調(diào)用refreshVisuals()方法, 因?yàn)樵摲椒〞?huì)頻繁調(diào)用,因此在調(diào)用前應(yīng)該做一些判斷來避免不必要的刷新
一般在active()方法中添加listener, deactive()中刪掉這些添加的listener,
在EditPart中, 由圖形修改導(dǎo)致模型修改是通過command來實(shí)現(xiàn), 而模型修改導(dǎo)致圖形修改則是通過listener來實(shí)現(xiàn)
EditPart是GEF的核心, 對(duì)于一個(gè)可編輯的模型元素都必須有一個(gè)對(duì)應(yīng)的EditPart類對(duì)應(yīng), 在EditPart中有兩個(gè)容易混淆的方法:getModelChildren()返回包含在當(dāng)前模型中的子模型, getChildren()返回子模型對(duì)應(yīng)的EditPart
如果父圖形不是子圖形的直接父親, 那么需要實(shí)現(xiàn)AbstractGraphicalEditPart.getContentPane()方法, 得到的對(duì)象將用來存放所有的子圖形
當(dāng)用戶在圖形編輯器中執(zhí)行操作的時(shí)候, GEF在內(nèi)部會(huì)創(chuàng)建相應(yīng)的Request, 比如新建一個(gè)對(duì)象將生成CreateRequest, 它包含了新建對(duì)象的模型實(shí)例, 用來存放該Request的EditPart
對(duì)于我們的EditPolicy實(shí)現(xiàn)來說, 我們要做的大部分工作就是根據(jù)request創(chuàng)建一個(gè)Comamnd對(duì)象, Command子類一般要實(shí)現(xiàn)execute和undo方法,execute方法就是用來將圖形的改變更新到模型上, Command更多的是對(duì)模型的依賴, 而跟GEF其他的組件沒有什么關(guān)系, 比如絕對(duì)不會(huì)去引用EditPart和EditPolicy實(shí)例
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢】