12.1 Swing概述

12.1 Swing概述

前一章已经介绍过AWTSwing的关系,因此不难知道:实际使用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对象。因此,SwingMVC实现也被称为Model-Delegate(模型-代理)。

对于一些简单的Swing组件通常无须关心它对应的Model对象,但对于一些高级的Swing组件,如JTreeJTable等需要维护复杂的数据,这些数据就是由该组件对应的Model来维护的。另外,通过创建Model类的子类或通过实现适当的接口,可以为组件建立自己的模型,然后用setModel()方法把模型与组件关联起来。

插拔式外观感觉

Swing在不同的平台上表现一致,并且有能力提供本地平台不支持的显示外观。由于Swing组件采用MVC模式来维护各组件,所以Swing组件的外观被改变时,对组件的状态信息(由模型维护)没有任何影响。因此,Swing可以使用插拔式外观感觉(Pluggable Look And Feel,PLAF)。来控制组件外观,使得Swing图形界面在同一个平台上运行时能拥有不同的外观,用户可以选择自己喜欢的外观。相比之下,在AWT图形界面中,由于控制组件外观的对等类与具体平台相关,因此AWT组件总是具有与本地平台相同的外观。

LAF

Swing提供了多种独立于各种平台的LAF(Look And feel),默认是一种名为MetalLAF,这种LAF吸收了Macintosh平台的风格,因此显得比较漂亮。Java7则提供了一种名为NimbusLAF,这种LAF更加漂亮。

程序 获取当前JRE所支持的LAF

为了获取当前JRE所支持的LAF,可以借助于UIManagergetInstalledFeels()方法,如下程序所示。

1
2
3
4
5
6
7
8
9
10
import javax.swing.*;

public class AllLookAndFeel {
public static void main(String[] args) {
System.out.println("当前系统可用的所有LAF:");
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
System.out.println(info.getName() + "--->" + info);
}
}
}

运行结果

1
2
3
4
5
Metal--->javax.swing.UIManager$LookAndFeelInfo[Metal javax.swing.plaf.metal.MetalLookAndFeel]
Nimbus--->javax.swing.UIManager$LookAndFeelInfo[Nimbus javax.swing.plaf.nimbus.NimbusLookAndFeel]
CDE/Motif--->javax.swing.UIManager$LookAndFeelInfo[CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel]
Windows--->javax.swing.UIManager$LookAndFeelInfo[Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel]
Windows Classic--->javax.swing.UIManager$LookAndFeelInfo[Windows Classic com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel]

除可以使用Java默认提供的数量不多的几种LAF之外,还有大量的Java爱好者提供了各种开源的LAF,有兴趣的读者可以自行去下载、体验各种LAF,使用不同的LAF可以让Swing应用程序更加美观。