GridLayout 核心行為
- 將容器劃分為 固定行數 × 固定列數 的矩形網格
- 元件依 加入順序 從左到右、上到下依序填入格子
- 每個格子大小完全相等,元件被拉伸填滿整個格子
- 建構子:
new GridLayout(rows, cols) 或 new GridLayout(rows, cols, hgap, vgap)
最小範例
//: GridLayout1.java
import java.awt.*;
import java.applet.*;
public class GridLayout1 extends Applet {
public void init() {
setLayout(new GridLayout(7, 3)); // 7行 x 3列 = 21格
for (int i = 0; i < 20; i++)
add(new Button("Button " + i)); // 只有20個按鈕
}
} ///:~
關鍵觀察
- 21 格位置,僅 20 按鈕 → 最後一格留空,無「置中」或「平衡」機制
- 所有按鈕尺寸相同,由容器大小除以行列數決定
- 若元件數量超過行×列,會自動增加行數 (若 cols 固定) 或列數 (若 rows 固定) 容納
rows=0 或 cols=0 表示「不限制該維度」,由另一維度與元件數量推算
進階特性
間距控制
new GridLayout(4, 3, 10, 5); // 水平間距 10px, 垂直間距 5px
動態行列計算
| 建構參數 | 行為 |
new GridLayout(3, 0) | 固定 3 行,列數自動計算 |
new GridLayout(0, 4) | 固定 4 列,行數自動計算 |
new GridLayout(0, 0) | 非法,拋出異常 |
適用場景 vs 不適用場景
| 適用 | 不適用 |
| 計算機鍵盤、電話按鍵盤 | 表單欄位對齊 (標籤寬度不一) |
| 圖示網格、縮圖牆 | 需要元件保持原始大小 |
| 等寬按鈕工具列 | 需要彈性空白壓縮/展開 |
| 簡單矩陣輸入介面 | 複雜對齊需求 (改用 GridBagLayout/MigLayout/JavaFX GridPane) |
現代化對應
- Swing:
GridLayout 相容,常搭配 JPanel 巢狀使用
- JavaFX:
GridPane 提供更強大功能:
- 可設定列/行約束 (
ColumnConstraints 百分比/最小/最大/填滿)
- 支援元件跨行/跨列 (
GridPane.setColumnSpan(node, 2))
- 可混合固定/計算/百分比寬度
- Web CSS:
display: grid / grid-template-columns: repeat(3, 1fr) 同樣概念但功能遠超 GridLayout
避坑指南
- 不要期望元件保持
preferredSize,GridLayout 強制拉伸填滿格子。
- 不要用於「標籤+輸入框」表單:標籤會被拉寬至與輸入框同寬,視覺失衡。
- 容器尺寸改變時,所有格子同步縮放,可能導致文字截斷,配合
setMinimumSize 緩解。
總結
GridLayout 是「等分網格」的純粹實現:簡單、高效、無彈性。適用於視覺上要求整齊劃一的介面區塊。複雜對齊需求請升級至 GridBagLayout/MigLayout/GridPane/CSS Grid。