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