Layout Manager 是 Java GUI 開發獨有的概念,初學者常覺得難以控制。本文從工程角度切入,以典型資料庫應用介面為例,示範如何透過容器分層分組與Layout 組合策略,建構彈性、可維護的介面架構。
典型資料庫應用介面可分為兩大區塊,再遞迴細分:
JFrame (BorderLayout)
├─ CENTER: DataContentPanel (BorderLayout)
│ ├─ CENTER: DataListPanel (GridLayout 1x1 / BorderLayout) → JList/JTable
│ └─ SOUTH: DataEditorPanel (GridBagLayout) → 編輯欄位群
└─ SOUTH: ButtonPanel (FlowLayout) → 功能按鈕群
| 容器層級 | Layout | 選擇理由 |
|---|---|---|
| 主視窗 / 大區塊切割 | BorderLayout | CENTER 自動填滿剩餘空間,N/S/E/W 保持固定尺寸,符合主視窗結構。 |
| DataContentPanel | BorderLayout | 列表佔大部份 (CENTER),編輯區固定高度 (SOUTH)。 |
| DataListPanel | GridLayout(1,1) 或 BorderLayout | 單一元件填滿,兩者皆可;GridLayout 更簡潔。 |
| DataEditorPanel | GridBagLayout | 表單欄位排列複雜,需精細控制對齊、跨行跨列、權重。 |
| ButtonPanel | FlowLayout | 按鈕水平排列、固定間距 (hgap)、視窗縮小時自動換行,優於 GridLayout 的強制等寬。 |
preferredSize,不強制拉伸。preferredSize,強制等分容器空間。理解這三者差異,即可預測視窗縮放時的元件行為。
public class LayoutSample {
public static void main(String[] args) {
JFrame frame = new JFrame("Layout Demo");
Container c = frame.getContentPane();
c.setLayout(new BorderLayout()); // 可省略,預設即為 BorderLayout
// DataContent (CENTER)
JPanel dataContent = new JPanel(new BorderLayout());
JPanel dataList = new JPanel(new GridLayout(1,1));
dataList.add(new JList());
JPanel dataEditor = new JPanel(); // 實際建議用 GridBagLayout
dataEditor.add(new JTextField(20));
dataContent.add(dataList, BorderLayout.CENTER);
dataContent.add(dataEditor, BorderLayout.SOUTH);
// Buttons (SOUTH)
JPanel buttons = new JPanel(new FlowLayout()); // 預設 FlowLayout
buttons.add(new JButton("新增"));
buttons.add(new JButton("修改"));
buttons.add(new JButton("刪除"));
buttons.add(new JButton("儲存"));
c.add(dataContent, BorderLayout.CENTER);
c.add(buttons, BorderLayout.SOUTH);
frame.setSize(400, 400);
frame.setVisible(true);
}
}
JPanel 預設 FlowLayout,JFrame 預設 BorderLayout,明確設定可避免誤解。掌握容器分層與 Layout 組合策略,Java GUI 版面配置將不再是難題,而是結構化的工程任務。