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包含了最棒的練習、技巧、訣竅以及如何入門