Swing (Java)

Java 5之Swing部件在X_Window系統的使用
Swing是一個為Java設計的GUI工具包，屬於Java基礎類的一部分。Swing包括了圖形用戶界面（GUI）功能，其組件包含：文本框、文本域、按鈕、表格、列表等。
Swing提供許多比AWT更好的屏幕顯示元素。它們用純Java寫成，所以同Java本身一樣可以跨平臺運行，這一點不像AWT。它們是JFC的一部分。它們支持可更換的面板和主題（各種操作系統默認的特有主題），然而不是真的使用原生平臺提供的設備，而是僅僅在表面上模仿它們。這意味著你可以在任意平臺上使用Java支持的任意麵板。輕量級元件的缺點則是執行速度較慢，優點就是可以在所有平臺上採用統一的行為。

**Hello World程序**
Swing程序
HelloWorldSwing.java 
import javax.swing.*;
public class HelloWorldSwing {
/*     * 創建並顯示GUI。出於線程安全的考慮，- 這個方法在事件調用線程中調用。
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("HelloWorldSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add the ubiquitous "Hello World" label.
JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.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控件或是高度自定義的視覺效果。

**可配置性**
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教程date=20050729004431 -  The Swing Connectiondate=20050731012822 -  JavaDesktop-  Java觀感date=20050715034602 -  ClientJava.com- Presentation " Swing專家編程：創建優雅的程序，第一部分" by Ben Galbraith- Presentation " Swing專家編程：創建優雅的程序，第二部分" by Ben Galbraith- Article " 什麼叫“Swing很慢？”" by Sermet Yucel- Article " Java桌面開發date=20050713081953 " by Andrei Cioroianu- Article " BlackMamba：一個Swing的實例學習date=20050404062833 " by Ashwin Jayaprakash-  有關AWT/Swing的文章-  Citations from CiteSeerdate=20051216162445 -  Swing wiki包含了最棒的練習、技巧、訣竅以及如何入門