Swing 作為 Java 桌面開發核心框架,雖然業務場景逐漸減少,但其 MVC 架構、線程模型、組件體系仍是面試高頻考點。本文梳理核心知識點並給出典型答案要點。
JFC 包含 Swing、AWT、Accessibility、Drag&Drop、2D API 等庫,為企業級桌面應用提供統一組件套件。Swing API 構建了 JFC 的核心組件庫。
| 維度 | AWT | Swing |
|---|---|---|
| 組件類型 | 重量級(依賴本地 Peer) | 輕量級(純 Java 繪製) |
| 跨平台一致性 | 差(外觀隨 OS 變化) | 優(可插拔 Look&Feel) |
| Z-Order 混用 | 不可與輕量級組件混合 | 始終位於 AWT 組件下層 |
| 繪製機制 | 委託本地 Peer 繪製 | 自繪(Graphics2D) |
DefaultTableModel、ButtonModel)BasicButtonUI 等)優勢:數據與視圖解耦,支持同一 Model 多視圖、動態切換 L&F。
SwingWorker 異步執行,publish/process 回調更新 UISwingUtilities.invokeLater/Runnable 提交任務到 EDT 隊列違規操作會導致界面凍結、繪製異常、數據竢態。
| 佈局 | 特點 | 典型場景 |
|---|---|---|
| BorderLayout | 五區域,ContentPane 默認 | 主視窗整體結構 |
| FlowLayout | 左到右換行,JPanel 默認 | 工具欄、按鈕組 |
| GridLayout | 等分行列 | 計算器鍵盤、表單網格 |
| GridBagLayout | 最靈活,約束復雜 | 複雜表單對齊 |
| BoxLayout | 單行/列,支持膠水/填充 | 工具欄、側邊欄 |
| CardLayout | 卡片切換 | 向導頁面、Tab 替代 |
| GroupLayout | GUI Builder 友好,橫縱獨立 | Matisse 可視化設計 |
JComponent.setDoubleBuffered(true) 開啟,離屏渲染減少閃爍,現代 Swing 默認開啟。
組件實現 Serializable,支持狀態持久化、RMI 傳遞、跨 VM 遷移。注意 transient 修飾非持久化字段。
通過 AccessibleContext 暴露組件語義,輔助屏幕閱讀器等輔助技術。
MDI (Multiple Document Interface) 核心組件,依附 JDesktopPane,支持最大化/最小化/圖標化/關閉/分層。
Action 接口擴展 ActionListener,封裝命令屬性(文本、圖標、啟用狀態),可共享給 Menu/Toolbar/Button,實現「一次定義,多處綁定」。
核心方法:setDragEnabled(true)、setDropMode(DropMode)、setTransferHandler()。支持組件間、應用間、文件系統數據交換。
JEditorPane + HTMLEditorKit 支持 HTML 3.2/CSS 1,內建解析器委託 javax.swing.text.html.parser。
JComponent 重寫 paintComponent(Graphics),調用 super.paintComponent(g) 保證背景繪製。setToolTipText() 或實現 getToolTipText(MouseEvent) 動態生成。掌握以上知識體系,應對 Swing 相關面試題綽綽有餘。