By cszhao1980
Swing出现之初,就提供一种非常前卫的功能,即PLAF——可拔插的Look And Feel,我们可以非常轻松的动态改变Swing程序的Look and Feel,哇乌,真酷。
JAVA的跨平台特性决定了它需要这样一种功能——它可以模拟所在平台的Look And Feel,从而使自己看起来像一个原生程序。不过,在大多数的平台上,JAVA程序都 默认使用META Look And Feel(在苹果的平台上,默认使用MAC Look And Feel)。
当然,我们可以轻松的改变这一点,比如下面的语句会将Look And Feel设置为Motif样式的:
UIManager.setLookAndFeel(new com.sun.java.swing.plaf.motif.MotifLookAndFeel( ));
遗憾的是,酷炫的功能往往都很难以理解,PLAF也是如此。
本文试图将这部分讲的尽量清楚——但只是一个High Level View,忽略了大量细节。
首先要理解的概念是 UI Delegate。
Swing Component并不自己绘制自身,而是将这个功能委托给UI delegate来完成。每个Component都有自己的UI Delegate,如下图所示,JTree组件将绘制工作委托给了MetalTreeUI对象来完成:
【注】:UI delegate Class往往按照这样的规则命名:
Look And Feel Name + Component Name(minus J) + UI。
UI delegate Class都继承自ComponentUI Class。
UI delegates对象采用静态的createUI()方法创建——这是个工厂方法,由工厂决定是为同一种Component的每个对象创建各自的UI Delegate对象,还是共享一个实例。
正如前面所说,每种Component都有自己的UI Delegate class。所以,JAVA程序必须确定它每一个Component应该使用的UI Class——需要一个高层的类来确定所有种类的Component UI,这个类就是LookAndFeel Class,该类的家族如下图所示:
Swing LookAndFeel class diagram
令人惊奇的是,LookAndFeel Class具有很简单的定义,比如,它的属性只有如下几种:
LookAndFeel properties |
|||||
Property |
Data type |
get |
is |
set |
Default value |
defaults |
UIDefaults |
· |
|
|
null |
description |
String |
· |
|
|
Abstract |
ID |
String |
· |
|
|
Abstract |
name |
String |
· |
|
|
Abstract |
nativeLookAndFeel(是否为Native?) |
boolean |
|
· |
|
Abstract |
supportedLookAndFeel(此平台是否支持?) |
boolean |
|
· |
|
Abstract |
supportsWindowDecorations |
boolean |
· |
|
|
false |
大多数的属性,仅是提供一个说明,如下表所示,常见的LookAndFeel Class的设置:
Property values for common Swing L&Fs |
|||
Look-and-feel |
ID |
Name |
Description |
MacLookAndFeel |
Mac |
MacOS |
The MacOS L&F |
MetalLookAndFeel |
Metal |
Metal |
The Java L&F |
MotifLookAndFeel |
Motif |
CDE/Motif |
The CDE/Motif L&F |
WindowsLookAndFeel |
Windows |
Windows |
The Microsoft Windows L&F |
那么,LookAndFeel是如何确定众多Component的UI呢,答案就在第一个属性“defaults”中。
Defaults是一个UIDefaults对象,而UIDefaults则负责完成各种Component的UI的选择。
【注】:LookAndFeel类的最重要的方法就是getDefaults()。
要提供自己的LookAndFeel class,就必须重载该方法中,返回自定义的UIDefaults对象。