GridLayout 核心特性
- 以「行 × 列」矩陣排列元件,依加入順序從左至右、上至下填充。
- 可動態調整行數或列數(另一維度自動計算)。
- 支援水平/垂直間距
setHgap()、setVgap()。
- 不支援跨行跨列,適合計算機按鍵盤、棋盤等等寬高佈局。
完整可執行範例
package com.utstar.factory;
import java.awt.*;
import javax.swing.*;
public class TestGridLayout extends JFrame {
private static final long serialVersionUID = 6819222900970457455L;
private JButton[] buttons = new JButton[6];
public TestGridLayout() {
setTitle("GridLayout 測試");
setSize(600, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
setVisible(true);
}
private void init() {
String[] labels = {"NORTH", "SOUTH", "EAST", "WEST", "CENTER", "CENTER6"};
for (int i = 0; i < labels.length; i++) {
buttons[i] = new JButton(labels[i]);
}
GridLayout layout = new GridLayout(2, 3); // 2 行 3 列
layout.setHgap(10);
layout.setVgap(10);
setLayout(layout);
for (JButton btn : buttons) {
add(btn);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(TestGridLayout::new);
}
}
關鍵技術點解析
- 建構子參數:
new GridLayout(rows, cols)。若 rows=0 則由列數決定行數;若 cols=0 則由行數決定列數;兩者皆為 0 會拋出異常。
- 間距設定:
setHgap(int)、setVgap(int) 僅影響元件間距,不影響邊框邊距;邊距請用 BorderFactory.createEmptyBorder()。
- 動態增減元件:
add() 後呼叫 revalidate() + repaint() 即可即時重排。
- 替代方案:需跨行跨列請改用
GridBagLayout 或 MigLayout(第三方)。
常見錯誤與避坑指南
- ❌ 直接
new GridLayout(2, 3) 卻加入 7 個元件 → 第 7 個會擠在新行,破壞原預期矩陣。
- ❌ 忘記
setVisible(true) 放在最後,導致元件未正確佈局就顯示。
- ✅ 建議在
SwingUtilities.invokeLater() 中建立 GUI,確保執行緒安全。