GridBagLayout 是 Swing 中功能最強大、靈活性最高的佈局管理器,也是最複雜的。它不要求組件大小一致,能將組件垂直、水平或沿基線對齊。本文通過一個記事本實戰案例,深度講解其核心約束屬性與佈局技巧。
| 屬性 | 說明 | 常用值 |
|---|---|---|
| gridx, gridy | 組件左上角網格坐標 | 相對定位用 RELATIVE |
| gridwidth, gridheight | 佔用網格數 | 0 表示該行/列最後一個 (REMAINDER) |
| weightx, weighty | 拉伸權重 (0.0-1.0) | 0=不拉伸,>0=按比例分配額外空間 |
| fill | 組件如何填充顯示區域 | NONE/HORIZONTAL/VERTICAL/BOTH |
| anchor | 組件在顯示區域內的對齊方式 | CENTER/NORTH/SOUTH/EAST/WEST 等 |
| insets | 組件外邊距 | new Insets(top, left, bottom, right) |
| ipadx, ipady | 組件內部填充 | 增加組件最小尺寸 |
目標佈局結構(行 × 列):
Row 0: [打開][保存][另存為][面板(佔4列)] Row 1: [下拉框(佔2列)][文本框(佔4列,可橫向拉伸)][清空] Row 2: [列表(佔2列,可縱向拉伸)][文本域(佔5列,可雙向拉伸)]
GridBagLayout layout = new GridBagLayout();
setLayout(layout);
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH; // 默認雙向填充
// 第1行:三個按鈕 + 面板
addButton("打開", 0, 0, 1, 1, 0, 0);
addButton("保存", 1, 0, 1, 1, 0, 0);
addButton("另存為", 2, 0, 1, 1, 0, 0);
// 面板佔4列,不拉伸,跟隨第2行文本框拉伸
c.gridwidth = GridBagConstraints.REMAINDER; // 0
c.weightx = 0; c.weighty = 0;
layout.setConstraints(panel, c);
// 第2行:下拉框(2列) + 文本框(4列,拉伸) + 清空按鈕
c.gridwidth = 2; c.weightx = 0; c.weighty = 0;
layout.setConstraints(comboBox, c);
c.gridwidth = 4; c.weightx = 1; c.weighty = 0; // 關鍵:weightx=1 獲得水平拉伸
layout.setConstraints(textField, c);
c.gridwidth = GridBagConstraints.REMAINDER; c.weightx = 0; c.weighty = 0;
layout.setConstraints(clearBtn, c);
// 第3行:列表(2列,縱向拉伸) + 文本域(5列,雙向拉伸)
c.gridwidth = 2; c.weightx = 0; c.weighty = 1;
layout.setConstraints(list, c);
c.gridwidth = 5; c.weightx = 1; c.weighty = 1;
layout.setConstraints(textArea, c);
// 開啟佈局調試:顯示網格邊框 DebugGraphics.setFlashCount(0); DebugGraphics.setFlashTime(0); // 或繼承 JPanel 重寫 paintComponent 畫網格
GridBagLayout 雖然學習曲線陡峭,但掌握 網格坐標 + 佔用範圍 + 拉伸權重 + 填充模式 這四大核心維度後,能輕松應對極其複雜的界面佈局需求。記住:先畫草圖規劃網格,再逐行配置約束 是最高效的工作流。