LAF系統(tǒng)是Swing的強大特性之一,它使得Java應(yīng)用程序能夠像原生程序一樣被裝飾起來。。通過改變程序的外觀,你能夠人們對你的程序的看法。
Java的Swing庫缺省使用Metal LAF,但所有版本的Swing都帶有包含了Motif LAF的ui.jar。另外,Windows版本的Swing包含Windows LAF,OS X版本的則包含Mac LAF。
try {
UIManager.setLookAndFeel("javax.swing.plaf.motif.MotifLookAndFeel");
//UIManager.setLookAndFeel("javax.swing.plaf.windows.WindowsLookAndFeel");
//UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
//UIManager.setLookAndFeel("com.apple.mrj.swing.MacLookAndFeel");
} catch(ClassNotFoundException cnfe) {
cnfe.printStackTrace( );
} catch(InstantiationException ie) {
ie.printStackTrace( );
} catch(IllegalAccessException iae) {
iae.printStackTrace( );
} catch(UnsupportedLookAndFeelException ulafe) {
ulafe.printStackTrace( );
}
// ‘frame‘ 是最高層的組件
SwingUtilities.updateComponentTreeUI(frame);
在try/catch塊中,當(dāng)UIManager被更新時,已存在的組件不會被更新。這些組件的更新要通過調(diào)用SwingUtilities的方法updateComponentTreeUI(java.awt.Component)。將最高層次的圖形用戶界面(GUI)組件傳遞給這個方法,所有的外觀風(fēng)格都會被更新。
Metal LAF比其他的外觀更強大一些,因為它是可主題化的。改變背景顏色只是Metal LAF廣泛的可主題化屬性之一,UIManager可為單個特定組件或整個平臺設(shè)置用戶訂制的主題。例如。你可以在任意LAF中像這樣指定一個組件的背景顏色:
UIManager.put("Tree.background",Color.yellow);
無論如何,Metal LAF允許你像這樣用一個BackgroundTheme類修改整個Swing外觀的背景:
package com.generationjava.swing;importjava.awt.Color;import javax.swing.plaf.ColorUIResource;import javax.swing.plaf.metal.DefaultMetalTheme;public class BackgroundTheme extends DefaultMetalTheme { private final ColorUIResource resource; public BackgroundTheme(Color color) { this.resource = new ColorUIResource(color); } public ColorUIResource getSecondary3( ) { return this.resource; }}
BackgroundTheme類可以像下面這樣使用:
importjavax.swing.UnsupportedLookAndFeelException;import javax.swing.UIManager;import javax.swing.plaf.metal.MetalLookAndFeel;....MetalLookAndFeel.setCurrentTheme(new BackgroundTheme(Color.yellow ) ); try { UIManager.setLookAndFeel( new MetalLookAndFeel( ) ); } catch(ClassNotFoundException cnfe) { cnfe.printStackTrace( ); } catch(InstantiationException ie) { ie.printStackTrace( ); } catch(IllegalAccessException iae) { iae.printStackTrace( ); } catch(UnsupportedLookAndFeelException ulafe) { ulafe.printStackTrace( ); }
注意:一旦MetalLookAndFeel被更改,要用setLookAndFeel方法重新裝載它。