詳解Swing組件相應外觀
Swing將每個組件的視圖和控制封裝到一個稱為UI委托的對象中。
因此,Swing的體系結構被稱為模型委托結構而不是模式-視圖-控制器結構。理想情況下,模型和UI委托直接的通訊是間接的,允許多個模型與一個UI委托相連,反之亦然。
UI委托
每個UI委托源自一個名為ComponentUI的抽象類。ComponentUI的方法描述了一個UI委托和使用它的組件之間進行通訊的基本原理。
注意的是每個方法都將JComponent作為一個參數。ComponentUI有很多方法,這里只給出幾個最重要的:
◆static ComponentUI createUI(JComponent c):該方法通常用來返回UI委托的一個共享實例,該UI委托通過定義ComponentUI子類本身而定義。這個共享實例用于相同類型的組件之間的共享(例如,所有使用金屬外觀的JButtons共享同樣的靜態UI委托實例,默認情況下,該委托實例在javax.swing.plaf.metal.MetalButtonUI中定義。
◆InstallUI(JComponent c):該方法在特定的組件上安裝ComponentUI。通常會給組件和它的模型添加一個監聽器,當狀態發生改變時來通知UI委托進行視圖的更新。
◆Update (Graphics g, JComponent c):如果組件是不透明的,那么應該描繪它的背景并調用paint(Graphics g,JComponent C)方法。
◆Paint (Graphics g, JComponent c):為了能夠正確地描繪,該方法要從組件收集所有需要的信息以及可能的模型。
為了增強特定UI委托的使用,我們可以調用一個組件的setUI()方法,如下所示:
JComponent類中定義了用于分配UI委托的方法,因為方法聲明中不包含特定組件代碼。然而,對數據模型而言這是不可能的,因為不存在所有模型可以追溯到的基接口(例如,不存在像Swing模型中的ComponentUI此類的基類)。為此,分配模型的方法在JComponent的子類中定義。
使用PLAF
Swing包含幾個UI委托集。每個集合中包含了用于大部分Swing組件的ComponentUI實現,且每個這樣的集合稱為一個PLAF實現。
javax.swing.plaf包有繼承自ComponentUI的抽象類組成,javax.swing.plaf.basic包中的類擴展了這些抽象類用來實現基本的外觀。UI委托集合是所有其它外觀類用作構建自己的外觀的基類?;就庥^不能自己使用因為BasicLookAndFeel是一個抽象類。有三個繼承自BasicLookAndFeel的可插拔式外觀實現:
◆Windows: com.sun.java.swing.plaf.windows.WindowsLookAndFeel
◆CDEMotif: com.sun.java.swing.plaf.motif.MotifLookAndFeel
◆Metal (default): javax.swing.plaf.metal.MetalLookAndFeel
同時還有一個模仿蘋果用戶接口的MacLookAndFeel,但是沒有包含在Java2中,必須單獨下載。多路外觀javax.swing.plaf.multi.MultiLookAndFeel擴展了javax.swing.plaf中的所有抽象類。它運行同時使用多種外觀的組合,且有意但并不僅限于和訪問外觀一起使用。每個多路UI委托的任務是管理每個它們的子UI委托。
每個外觀包中都包含了一個繼承自抽象類javax.swing.LookAndFeel:BasicLookAndFeel, MetalLookAndFeel, WindowsLookAndFeel等的類。這是訪問每個外觀包的中心點。當改變當前外觀時,你會用到它們。同時UIManager類(用于管理安裝的外觀)使用它們來訪問當前外觀UIDefaults表(其中包含了用于每個Swing組件相應外觀的UI委托類名稱)。
要想改變應用的當前外觀,你只需要簡單調用UIManager的setLookAndFeel()方法,并將要使用的外觀全名傳遞給該方法即可。
創建一個PLAF
在創建一個PLAF之前,你必須在Java中創建外觀的兩種設計方法中做出決定。其中一種方法是通過擴展javax.swing.plaf包來創建外觀,另一種方法是通過擴展已經存在的外觀包,通常是javax.swing.plaf.basic來實現。
如果要創建一個用于PC的外觀,我們不推薦使用擴展來自javax.swing.plaf包中的外觀的方法。這是因為javax.swing.basic包中已經擴展了幾乎整個的javax.swing.plaf包供我們使用。這樣我們可以通過挑選外觀需要的東西來進行定制而不需要擴展和實現任何東西。
javax.swing.plaf包的實現遵循的一個基本原則是使得定制一個外觀盡可能的簡單。這個原則是LookAndFeel類中組件,顏色和UI類的中心。
javax.swing.plaf.basic包以我們希望的方式描繪輕量級Swing組件。如果你是為一臺設備而不是計算機屏幕創建一個外觀,那么最好的方法是從零開始擴展javax.swing.plaf包。
Peter V.Mikhalenko是 Sun公司認證專業技術人員,現為Deutsche銀行業務顧問。
【編輯推薦】