Swing 屬於 JFC(Java Foundation Classes)核心組件之一。JFC 包含 AWT、Swing、無障礙 API、Java 2D 與拖放功能。Swing 的誕生旨在解決 AWT(Abstract Window Toolkit)跨平台移植性差、企業級組件不足的問題。Swing 建立在 AWT 核心之上,JDK 1.2 起內建標準庫。
Swing 內部採用簡化的 MVC(Model-View-Controller)模式:
這種設計讓單一 Model 可對應多個 UI Delegate,極大提升了靈活性與可擴展性。
public class ToolbarFrame extends Frame {
public ToolbarFrame() {
super("My Toolbar (Swing)");
setSize(450, 250);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
關鍵點:透過匿名內部類繼承 WindowAdapter 並覆寫 windowClosing,註冊給視窗,否則無法正常關閉。
public class ToolbarFrame2 extends javax.swing.JFrame {
public ToolbarFrame2() {
initComponents();
}
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, Short.MAX_VALUE));
layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, Short.MAX_VALUE));
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(() -> new ToolbarFrame2().setVisible(true));
}
}
差異:繼承 JFrame 而非 AWT 的 Frame;使用 GroupLayout 自動佈局;啟動時包裝在 EventQueue.invokeLater 確保 EDT 執行緒安全。
NetBeans 設計檢視會自動產生變數宣告與初始化:
private javax.swing.JButton jButton1;
// 在 initComponents 中
jButton1 = new javax.swing.JButton();
所有 Swing 元件皆提供 addActionListener(ActionListener l)。當事件觸發,會回呼 actionPerformed(ActionEvent evt)。NetBeans 可自動產生註冊碼:
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
開發者只需在對應的 jButton1ActionPerformed 方法填入業務邏輯。多按鈕時各自獨立內部類,互不干擾。

