Java 佈局哲學三大特徵
- 全代碼驅動:無資源檔 (如 .rc, .xib, .fxml, .xml),佈局邏輯寫在 Java 代碼中。
- 布局管理器模式:容器委託
LayoutManager 決定子元件位置/大小,而非絕對座標 (setBounds)。
- 自適應核心:視窗大小改變 → 佈局管理器重新計算 → 元件自動調整位置/大小,支援跨平台/跨解析度一致體驗。
核心類別架構
Container (繼承 Component):add(Component), setLayout(LayoutManager), doLayout()
LayoutManager 介面:addLayoutComponent(), removeLayoutComponent(), preferredLayoutSize(), minimumLayoutSize(), layoutContainer()
LayoutManager2 延伸:支援約束參數 (add(comp, constraints)),如 BorderLayout, GridBagLayout, CardLayout
標準布局管理器速查
| 管理器 | 特徵 | 典型用途 |
FlowLayout | 水平流式、自動換行、偏好尺寸 | 工具列、標籤雲、Panel 預設 |
BorderLayout | 五區域、Center 彈性、Frame/Dialog 預設 | 主視窗骨架、分割面板 |
GridLayout | 固定行列等分、強制拉伸 | 計算機鍵盤、縮圖牆 |
CardLayout | 疊放卡片、單顯示、字串識別切換 | 精靈對話框、狀態切換 |
GridBagLayout | 複雜約束、11參數、極度靈活 | 複雜表單 (建議改用巢狀面板/MigLayout) |
佈局流程
- 容器
add(comp) 或 add(comp, constraints)
- 容器
validate() / doLayout() (視窗顯示/大小改變時自動觸發)
- 布局管理器
layoutContainer(parent):
- 查詢子元件
getPreferredSize(), getMinimumSize(), getMaximumSize()
- 依演算法計算各元件
setBounds(x, y, w, h)
元件三大尺寸契約
| 方法 | 語意 | 布局管理器使用策略 |
getPreferredSize() | 理想尺寸 | 優先嘗試滿足 (FlowLayout, BorderLayout North/South/West/East) |
getMinimumSize() | 最小可用尺寸 | 空間不足時壓縮下限 (GridBagLayout, BoxLayout, MigLayout) |
getMaximumSize() | 最大允許尺寸 | 空間過剩時擴展上限 (BoxLayout, MigLayout, JavaFX) |
自訂元件 (Canvas, JComponent, Region) 必須正確覆寫三尺寸,否則佈局失效。
巢狀面板組合策略 (最佳實踐)
// 主視窗 BorderLayout
frame.setLayout(new BorderLayout());
frame.add(header, BorderLayout.NORTH);
frame.add(content, BorderLayout.CENTER);
frame.add(footer, BorderLayout.SOUTH);
// 內容區再分割
content.setLayout(new BorderLayout());
content.add(sidebar, BorderLayout.WEST);
content.add(main, BorderLayout.CENTER);
// 側邊欄內部 GridLayout
sidebar.setLayout(new GridLayout(0, 1, 5, 5));
for (Component c : widgets) sidebar.add(c);
// 主區域 FlowLayout 工具列 + CardLayout 內容
main.setLayout(new BorderLayout());
main.add(toolbar, BorderLayout.NORTH);
main.add(pages, BorderLayout.CENTER); // CardLayout
現代化演進
| 時代 | 技術 | 佈局特色 |
| AWT | 5 大基本管理器 | 重量級、原生同級、功能有限 |
| Swing | + BoxLayout, OverlayLayout, ViewportLayout, SpringLayout | 輕量級、可換膚、MigLayout 第三方神器 |
| JavaFX | BorderPane, GridPane, HBox, VBox, StackPane, TilePane, FlowPane, AnchorPane | CSS 樣式分離、FXML 宣告式、屬性綁定、響應式 |
| Web | Flexbox, Grid, Container Queries | 瀏覽器原生、響應式設計標準 |
總結
Java 佈局管理器模式是相對佈局、自適應、關注點分離的經典實踐。從 AWT 五大基礎管理器到 JavaFX/CSS 的宣告式響應式佈局,核心哲學不變:描述「關係」而非「座標」。掌握巢狀面板組合與元件三尺寸契約,是構建健壯、可維護、跨平台 UI 的不二法門。