最簡單的佈局管理器,組件按添加順序從左到右、自動換行,類似文字排版。默認居中對齊。
new FlowLayout() // 默認:居中,hgap=5, vgap=5 new FlowLayout(int align) // 對齊:LEFT/CENTER/RIGHT new FlowLayout(int align, int hgap, int vgap) // 完全控制
public class FlowLayoutDemo extends JFrame {
public FlowLayoutDemo() {
setTitle("FlowLayout - 右對齊、間距 10px");
setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
for (int i = 0; i < 12; i++) {
add(new JButton("Btn " + i));
}
setSize(350, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(FlowLayoutDemo::new);
}
}
將容器劃分為五大區域:NORTH、SOUTH、WEST、EAST、CENTER。CENTER 區域自動填滿剩餘空間,最常放置主內容區(表格、編輯器、滾動面板)。
container.add(component, BorderLayout.CENTER); // 或 container.add(component, "Center"); // 字符串常量也可
public class BorderLayoutDemo extends JFrame {
public BorderLayoutDemo() {
setTitle("BorderLayout - 經典主窗口");
setLayout(new BorderLayout(5, 5)); // hgap, vgap
// 頂部工具欄
JToolBar toolbar = new JToolBar();
toolbar.add(new JButton("新建"));
toolbar.add(new JButton("打開"));
toolbar.add(new JButton("保存"));
add(toolbar, BorderLayout.NORTH);
// 左側導航樹
JTree tree = new JTree();
add(new JScrollPane(tree), BorderLayout.WEST);
// 中心工作區
JTextArea editor = new JTextArea();
add(new JScrollPane(editor), BorderLayout.CENTER);
// 右側屬性面板
JPanel props = new JPanel(new GridLayout(0,1));
props.setBorder(BorderFactory.createTitledBorder("屬性"));
add(props, BorderLayout.EAST);
// 底部狀態欄
JLabel status = new JLabel("就緒 ");
status.setBorder(BorderFactory.createEmptyBorder(0,5,0,5));
add(status, BorderLayout.SOUTH);
setSize(800, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(BorderLayoutDemo::new);
}
}
將容器劃分為規則矩形網格,每個單元格大小完全相同,組件按行優先順序填充。適合計算器鍵盤、表單網格、圖標面板等。
new GridLayout(int rows, int cols) // 行、列,一個可為 0 表示不限 new GridLayout(int rows, int cols, int hgap, int vgap) // 帶間距
public class GridLayoutDemo extends JFrame {
public GridLayoutDemo() {
setTitle("GridLayout - 計算器鍵盤");
// 4行4列,間距5px,行數固定4,列數0表示自動計算(此處相同)
setLayout(new GridLayout(4, 4, 5, 5));
String[] keys = {
"7","8","9","/",
"4","5","6","*",
"1","2","3","-",
"0",".","=","+"
};
for (String key : keys) {
JButton btn = new JButton(key);
btn.setFont(btn.getFont().deriveFont(18f));
add(btn);
}
setSize(300, 350);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(GridLayoutDemo::new);
}
}
| 特性 | FlowLayout | BorderLayout | GridLayout |
|---|---|---|---|
| 佈局邏輯 | 流式換行 | 五區域分割 | 規則網格 |
| 組件尺寸 | 優先尺寸 | CENTER自適應,其餘優先尺寸 | 強制等分 |
| 響應縮放 | 自動換行 | CENTER自適應最佳 | 等比縮放 |
| 典型場景 | 工具欄、按鈕組、標簽組 | 主窗口、對話框、分割面板 | 計算器、表單網格、圖標牆 |
| 嵌套靈活性 | 高 | 極高(區域再嵌套) | 中 |
真實項目中通過面板嵌套組合多種佈局:
// 主窗口:BorderLayout
JPanel main = new JPanel(new BorderLayout());
// 頂部:FlowLayout 工具欄
JPanel toolbar = new JPanel(new FlowLayout(FlowLayout.LEFT));
toolbar.add(new JButton("A")); toolbar.add(new JButton("B"));
main.add(toolbar, BorderLayout.NORTH);
// 中心:GridLayout 表單
JPanel form = new JPanel(new GridLayout(3, 2, 5, 5));
form.add(new JLabel("用戶名:")); form.add(new JTextField());
form.add(new JLabel("郵箱:")); form.add(new JTextField());
form.add(new JLabel("電話:")); form.add(new JTextField());
main.add(form, BorderLayout.CENTER);
// 底部:FlowLayout 右對齊按鈕組
JPanel btns = new JPanel(new FlowLayout(FlowLayout.RIGHT));
btns.add(new JButton("取消")); btns.add(new JButton("確定"));
main.add(btns, BorderLayout.SOUTH);
new GridLayout(3, 2) 實際可能 3x3)getPreferredSize()Box.createGlue()、Strut、RigidArea 實現彈性佈局"wrap 2, gap 10",極其簡潔強大,現代 Swing 開發首選掌握 FlowLayout、BorderLayout、GridLayout 三大核心佈局及其組合嵌套,足以應對 90% 的 Swing 界面開發需求。下一節將探討事件處理機制與監聽器模式。