Draw2d裏的Invalidating和Updating,佈局管理器

導讀:

  本文部分內容來自Building a Database Schema Diagram Editor with GEF和GEF and Draw2d Plug-in Developer Guide,是對Draw2D裏一些基本概念的說明。

  LayoutManager(佈局管理器)

  佈局管理器通過Figure#setBounds()改變子圖形的位置和大小。

  根據佈局算法和子圖形決定當前圖形的preferredSize。

  佈局的過程是先確定圖形的大小,再計算每個子圖形的新位置和大小。

  Figure#invalidate()

  若valid屬性已經是false則直接返回。

  如果圖形擁有LayoutManager,則調用LayoutManager的invalidate()方法,在XYLayout裏作用是將preferredSize重置爲null值,在FlowLayout裏還要把minimumSize置爲null值。

  將圖形的valid屬性置爲false。

  Figure#revalidate()

  我覺得它實際代表"recursive invalidate"的意思。這個方法的功能是首先將圖形自己invalidate(),然後遞歸的將圖形的父圖形invalidate(),一直到根圖形爲止,這個根圖形會被加入到UpdateManager的一個列表中。

  在Figure的很多方法裏,如setBorder()、setContstraint()、setLayoutManager()、add()、remove()等,會自動調用revalidate()方法。因此,大部分情況下我們不需要手動調用這個方法。

  Figure#validate()

  若valid屬性已經是true則直接返回。

  將圖形的valid屬性置爲true。

  如果圖形擁有LayoutManager,則調用LayoutManager的layout()方法。

  對圖形的每個子圖形,調用validate()方法。

  Figure#repaint()

  在圖形的UpdateManager裏,將圖形所處的區域標記爲“髒”區域,這個區域將由UpdateManager(定期)重畫。

  在圖形的setVisible()、setOpaque()、setForegroundColor()、setBounds()、setBackgroundColor()等方法裏會自動調用repaint()方法。

  Figure#paint()

  雖然名稱相似,但這個方法和repaint()關係不大。在Figure裏這個方法按順序調用paintFigure()、paintClientArea()和paintBorder()這三個方法,當實現自己的Figure時,絕大多數情況下應該只覆蓋paintFigure()而不是paint()本身。

  Figure#getPreferredSize()

  對於Label這樣的圖形,它的preferredSize由它所顯示的文本和圖標所佔空間決定;如果一個圖形包含子圖形,則它的preferredSize要考慮子圖形的排列方式,所以要由LayoutManager來決定。

  LayoutManager的getPreferredSize()方法還有兩個參數:wHint和hHint,它們分別代表圖形的已知長(寬)度,如果其中一個值是大於零的,則在另一個方向上子圖形將換行(列)排列,以保證長(寬)度不大於這個已知值。

  基本上來說,validate是對於尺寸的調整,而repaint()是對顏色的調整。當我們把一個圖形C作爲子圖形拖到另一個圖形P裏的時候(想象P爲UML類圖裏表示類的矩形,C爲表示屬性或方法的矩形),因爲調用了P的add()方法,所以P及P的所有“祖先”圖形都將通過revalidate()被置爲invalid狀態。UpdateManager隨後在performUpdate()裏對這些圖形進行validate(),在validate()的過程中,每個圖形將通過自己的LayoutManager重新計算自己的尺寸。這樣就實現了P隨子圖形的多少自動改變大小。

  validate.gif

  

  上面左圖是在子圖形上發生改變時,自動調用了Fig4的invalidate()方法,導致到根圖形之間的所有圖形的invalidate()方法被觸發。右圖則是UpdateManager對這些invalid圖形進行validate(),並且是自上而下進行的(幾乎可以認爲validate()方法就是對layout()方法的調用)。注意到由於對Fig2進行了layout(),Fig5的尺寸也可能因此發生改變,如果發生了這種情況,則Fig5的invalidate()方法也會被調用。



本文轉自

http://bjzhanghao.cnblogs.com/archive/2005/09/15/237923.html
發佈了31 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章