12.1 Swing概述
12.1 Swing概述
前一章已经介绍过AWT
和Swing
的关系,因此不难知道:实际使用Java
开发图形界面程序时,很少使用AWT
组件,绝大部分时候都是用Swing
组件开发的。Swing
是由100%纯Java
实现的,不再依赖于本地平台的GUI
,因此可以在所有平台上都保持相同的界面外观。独立于本地平台的Swing
组件被称为轻量级组件;而依赖于本地平台的AWT
组件被称为重量级组件。
Swing相应速度慢一点
由于Swing
的所有组件完全采用Java
实现,不再调用本地平台的GUI
,所以导致Swing
图形界面的显示速度要比AWT
图形界面的显示速度慢一些,但相对于快速发展的硬件设施而言,这种微小的速度差别无妨大碍。
Swing优势
使用Swing
开发图形界面有如下几个优势:
Swing
组件不再依赖于本地平台的GUI
,无须采用各种平台的GUI
交集,因此Swing
提供了大量图形界面组件,远远超出了AWT
所提供的图形界面组件集。Swing
组件不再依赖于本地平台GUI
,因此不会产生与平台相关的bug
Swing
组件在各种平台上运行时可以保证具有相同的图形界面外观。
Swing特征
Swing
提供的这些优势,让Java
图形界面程序真正实现了“Write Once,Run Anywhere
”的目标。除此之外,Swing
还有如下两个特征。
MVC
Swing
组件采用MVC
(Model-View-Controller
,即模型一视图一控制器)设计模式,其中模型(Model
)用于维护组件的各种状态,
- 视图(
view
)是组件的可视化表现, - 控制器(
Controller
用于控制对于各种事件、组件做出怎样的响应。 - 当模型发生改变时,它会通知所有依赖它的视图,视图会根据模型数据来更新自己。
模型对象
Swing
使用UI
代理来包装视图和控制器,还有另一个模型对象来维护该组件的状态。例如,按钮JButton
有一个维护其状态信息的模型ButtonModel
对象。Swing
组件的模型是自动设置的,因此一般都使用JButton
,而无须关心ButtonModel
对象。因此,Swing
的MVC
实现也被称为Model-Delegate
(模型-代理)。
对于一些简单的Swing
组件通常无须关心它对应的Model
对象,但对于一些高级的Swing
组件,如JTree
、JTable
等需要维护复杂的数据,这些数据就是由该组件对应的Model
来维护的。另外,通过创建Model
类的子类或通过实现适当的接口,可以为组件建立自己的模型,然后用setModel()
方法把模型与组件关联起来。
插拔式外观感觉
Swing
在不同的平台上表现一致,并且有能力提供本地平台不支持的显示外观。由于Swing
组件采用MVC
模式来维护各组件,所以当Swing
组件的外观被改变时,对组件的状态信息(由模型维护)没有任何影响。因此,Swing
可以使用插拔式外观感觉(Pluggable Look And Feel
,PLAF
)。来控制组件外观,使得Swing图形界面在同一个平台上运行时能拥有不同的外观,用户可以选择自己喜欢的外观。相比之下,在AWT
图形界面中,由于控制组件外观的对等类与具体平台相关,因此AWT
组件总是具有与本地平台相同的外观。
LAF
Swing
提供了多种独立于各种平台的LAF
(Look And feel)
,默认是一种名为Metal
的LAF
,这种LAF
吸收了Macintosh
平台的风格,因此显得比较漂亮。Java7
则提供了一种名为Nimbus
的LAF
,这种LAF
更加漂亮。
程序 获取当前JRE
所支持的LAF
为了获取当前JRE
所支持的LAF
,可以借助于UIManager
的getInstalledFeels()
方法,如下程序所示。
1 | import javax.swing.*; |
运行结果
1 | Metal--->javax.swing.UIManager$LookAndFeelInfo[Metal javax.swing.plaf.metal.MetalLookAndFeel] |
除可以使用Java
默认提供的数量不多的几种LAF
之外,还有大量的Java
爱好者提供了各种开源的LAF
,有兴趣的读者可以自行去下载、体验各种LAF
,使用不同的LAF
可以让Swing
应用程序更加美观。