第三章 Java AWT移植到.NET Windows Forms的可行性
3.2 GuiWrapper設計
3.2.2 Event模式
3.2.2.2 Painting模式
在 GuiWrapper 的設計下,AWT 的事件模式可以透過 Windows Forms 的幫忙,得以正常運作。不過在 AWT 中,唯一有一種事件不是遵循之 前的 Event-listener 的模式來處理的,那就是 Paint 事件[14]。我
們先介紹 AWT 中如何處理 Paint 事件的 Painting 模式,以及問題所 在。
AWT 中的 Paint 事件分成兩種:
系統產生(System-triggered):
由系統發出的 Paint 事件,像是控制項第一次顯示在畫面以或控 制項改變大小,此時該控制項都需要重新繪製。
應用程式產生(App-triggered):
由應用程式發出的 Paint 事件,當程式設計師需要改變控制項顯 示資料時,發出此事件讓控制項重新繪製。
當程式在執行時,Paint 事件會由不同方式產生,存放在事件佇 列內,等待被處理(圖 3-17)。
圖 3-17、產生 PAINT EVENT
UI 執行緒則會定時去事件佇列中取得事件來處理。由於 Paint 事 件分成兩種來源,因此 UI 執行緒取得 Paint 事件時會根據來源,分 別呼叫 Component 的 paint()方法或 Component 的 update()方法(圖 3-18)。
圖 3-18、處理 PAINT EVENT
因此程式中如果要處理 Paint 事件的話,必須覆寫 Component 中 的 paint()或 update()這兩個方法,並沒有任何 Listener 可以用來 註冊 Paint 事件。接著詳細介紹 paint()方法和 update()方法:
paint()方法:
負責繪製控制項。當發生系統產生的 Paint 事件時被呼叫。
update()方法:
負責更新控制項。當發生應用程式產生的 Paint 事件時被呼叫。
預設的功能是先清除控制項背景,然後呼叫 paint()繪製控制項。
在 Windows Forms 中,要處理 Paint 事件有兩種方式。一種是遵 循 Event-listener 模式,Listener 對控制項註冊發生 Paint 事件後 要被呼叫的 Callback 方法,當發生 Paint 事件時呼叫 Callback 方 法。不過此種方式無法取代控制項原本預設的繪圖動作。
另一種方式和 AWT 類似,當發生 Paint 事件時,Windows Forms 會先呼叫控制項的 OnPaintBackground()方法,接著呼叫 OnPaint() 方法。接著詳細介紹 OnPaintBackground()方法和 OnPaint()方法:
OnPaintBackground()方法:
負責繪製控制項的背景。當發生 Paint 事件時首先被呼叫。
OnPaint()方法:
負責繪製控制項。當發生 Paint 事件時接著 OnPaintBackground() 被呼叫。
根據上面介紹,可以發現在 Windows Forms 中處理 Paint 事件的 方法,在語意上來探討,OnPaintBackground()和 OnPaint()兩個方 法加起來只有對應到 AWT 中的 paint()方法,並沒有任何一個方法對 應到 update()方法。因此 GuiWrapper 設計時為了解決這個問題,提 出了下列的解決方案(圖 3-19):
覆寫 OnPaintBackground()方法:
讓 OnPaintBackground()方法架空,不作任何事情。避免控制項 的背景重複繪製。
覆寫 OnPaint()方法:
讓 OnPaint()方法 呼叫 update()方法。
由於 update()方法在 AWT 中預設實作是呼叫 paint()方法,因此 不管發生系統產生的 Paint 事件或是應用程式產生的 Paint 事件,
update()方法和 paint()方法都會被依序呼叫。
圖 3-19、GUIWRAPPER在 PAINT EVENT的解決方案
因為 GuiWrapper 採用此解決方案,因此原本使用 Java AWT 開發 圖形使用者介面程式的程式設計師,必須遵守下列指導方針,才能讓
程式移植順利:
不要覆寫 update()方法。
GuiWrapper 在 Painting 模式上的設計,使得程式設計師需要遵 守指導方針,才可以將 Painting 模式移植到 Windows Forms 之後,
得到與之前處理的相似過程。由於程式設計師為了遵循指導方針,有 可能會需要修改程式碼。因此,Painting 模式使用 GuiWrapper 移植 的可行性是:弱可移植。
在本節的最後,把使用 GuiWrapper 的可移植性,做個總結:
Component 模式:
Component hierarch 的可移植性是:完全可移植。
Layout manager 的可移植性是:強可移植。
Graphics 的可移植性是:完全可移植。
Event 模式:
通用 Event 模式的可移植性是:完全可移植。
Painting 模式的可移植性是:弱可移植。