Swing (Java)

Swing是一个为Java设计的GUI工具包，属于Java基础类的一部分。Swing包括了图形用户界面（GUI）功能，其组件包含：文本框、文本域、按钮、表格、列表等。

Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成，所以同Java本身一样可以跨平台运行，这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题（各种操作系统默认的特有主题），然而不是真的使用原生平台提供的设备，而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用Java支持的任意面板。轻量级元件的缺点则是执行速度较慢，优点就是可以在所有平台上采用统一的行为。

## Hello World程序

Swing程序

HelloWorldSwing.java

```Java
import javax.swing.*;

public class HelloWorldSwing {
    /**
     * 创建并显示GUI。出于线程安全的考虑。
     * 这个方法在事件调用线程中调用。
     */
    private static void createAndShowGUI() {
	
	    // 确保的窗口装饰美观
	    JFrame.setDefaultLookAndFeelDecorated(true);

        // 创建并设置窗口
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.setResizable(true);
	    frame.setSize(300, 200);

        // 添加 "Hello World" label
        JLabel label = new JLabel("Hello World");
        frame.add(label);

        // 显示窗口
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
```

## 历史

互联网基础类（IFC）是网景公司最初为Java开发的图形库，第一次发布于1996年12月16日。

在1997年4月2日，太阳公司和网景公司宣称他们要将IFC和其他技术合并形成Java基础类。作为IFC最初提供组件的附加品，Swing引进了一个机制：在不改变大量的程序代码前提下允许程序中每个组件面板的变化。支持可更换面板技术的引入允许Swing组件在模拟原生组件外观的同时又保持了平台独立的优点。

## 架构

Swing是一个基于Java的跨平台MVC框架。使用单线程模式。此框架还在代码结构层和图形渲染层之间插入了一个抽象层。

### 可扩展性

Swing使用了高度模块化的架构，可以通过接口的方式使用各种定制框架来扩展Swing。用户可以通过Java的继承机制重写原始的组件来实现自己的代码。

Swing是一个基于组件的框架，所有的组件都是从javax.swing.JComponent类继承来的。Swing对象通过异步方式发送事件，具有边界属性，并且会响应该组件的一系列方法。Swing组件是Java Beans组件，和Java Beans组件架构完全保持一致。

### 可定制性

Swing提供了可编程渲染模型，使用户可以对渲染细节进行控制。一般来看，Swing组件的视觉效果是一些通用元素的组合，比如外框、边距、窗口装饰等等。典型的情况是，用户通过编写代码，指定边框、颜色、背景、透明度等属性来定制一种通用Swing组件（如JTable）。核心组件则会用这些定制的属性来进行绘制。此外，也完全可以制作出非常特殊的GUI控件或是高度自定义的视觉效果。

<image>

- Swing个性化绘制1

<image>

- Swing个性化绘制2

<image>

- Swing个性化绘制3

### 可配置性

Swing高度基于运行时的机制以及其间接的组合模式使得它可以在运行时响应对其底层设置的改变。例如，一个Swing的应用程序能在运行时动态地改变界面。此外，用户还能随时应用他们自己的Look And Feel。Look And Feel能够统一地改变当前程序的组件外观，而不用修改任何代码。

## 和AWT的关系

Java的早期版本以来，抽象视窗工具包为用户界面组件提供了平台独立的API。在AWT中，每个组件都由一个原生的等同组件生成和控制，这个原生组件是由当前的图形视窗系统决定的。

与此相对，Swing组件经常被描述为轻量级的，因为它们不需要操作系统本身所带视窗工具包的原生资源来生成。

Swing API的大部分是AWT的补充扩展而不是直接的代替。Swing用来绘制轻量级组件的核心渲染功能是由Java2D提供的，这是AWT的一部分。然而，轻量级和重量级组件在同一个应用中使用会导致Z-order不兼容。

## 同SWT的关系

标准器件工具包 (SWT)是一个最初由IBM开发的工具包，现在由Eclipse基金会维护。SWT的实现同重量级的组件AWT有更多的共同之处。这样的好处是运行开销同所在平台的原生视窗工具包更为接近。

SWT的到来使得Java桌面的开发者们分离为SWT的支持者和Swing的支持者。在6.0版Java中，Swing的新修补专注于同原生视窗平台的逼真度，这可能会直接解决这个问题。

## 参考文献

### 书籍

- Matthew Robinson：Swing, Manning, ISBN 1-930110-88-X
- David M. Geary：Graphic Java 2, Volume 2: Swing, Prentice Hall, ISBN 0-13-079667-0
- James Elliott，Robert Eckstein，Marc Loy，David Wood，Brian Cole：Java Swing, O'Reilly, ISBN 0-596-00408-7
- Kathy Walrath，Mary Campione，Alison Huml，Sharon Zakhour：The JFC Swing Tutorial: A Guide to Constructing GUIs, Addison-Wesley Professional, ISBN 0-201-91467-0

## 外部链接

- Swing教程
- The Swing Connection
- JavaDesktop
- Java观感
- ClientJava.com
- Presentation " Swing专家编程：创建优雅的程序，第一部分" by Ben Galbraith
- Presentation " Swing专家编程：创建优雅的程序，第二部分" by Ben Galbraith
- Article " 什么叫“Swing很慢？”" by Sermet Yucel
- Article " Java桌面开发" by Andrei Cioroianu
- Article " BlackMamba：一个Swing的实例学习" by Ashwin Jayaprakash
- 有关AWT/Swing的文章
- Citations from CiteSeer
- Swing wiki包含了最棒的练习、技巧、诀窍以及如何入门