JPanel 內組件(按鈕、標籤、文本框等)位置固定、無法靈活調整,預設 FlowLayout 僅能左右流式排列,無法實現精確定位或響應式佈局。
// 設置 JPanel 邊框空白邊距
panel.setBorder(BorderFactory.createEmptyBorder(10, 15, 10, 15)); // 上右下左
// 組件級邊距(需組件支援,如 JButton)
button.setMargin(new Insets(5, 10, 5, 10)); // 內邊距
button.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10)); // 外邊距效果
適用於:微調間距、美化現有 FlowLayout/GridLayout 佈局。
| 佈局管理器 | 特點 | 適用場景 | 位置控制方式 |
|---|---|---|---|
| BorderLayout | 五大區域(北南東西中) | 主視窗整體結構、頂部工具欄+中間內容+底部狀態欄 | add(comp, BorderLayout.CENTER) |
| GridLayout | 規則網格,等寬等高 | 計算器鍵盤、表格式表單、圖片網格 | 自動分配,不可單獨控制單元格大小 |
| GridBagLayout | 最強大、最複雜,網格+約束 | 複雜表單、需精確控制組件跨行跨列、對齊、權重 | GridBagConstraints 設定 gridx/y, weightx/y, fill, anchor, insets |
| BoxLayout | 單行/單列,支援膠水/硬性空白 | 工具欄、垂直表單、按鈕組 | Box.createRigidArea, Box.createGlue, createHorizontalStrut |
| MigLayout (第三方) | 字串配置、極其簡潔強大 | 所有複雜佈局首選,替代 GridBagLayout | new MigLayout("wrap 2", "[][grow]") 等字串語法 |
**單一佈局管理器難以滿足複雜界面**,實際開發採用「大容器用 BorderLayout,子區域用專用佈局」的嵌套策略:
JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); // 主容器,帶間隙
// 頂部:工具欄 - FlowLayout 右對齊
JPanel topBar = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));
topBar.add(btnSave); topBar.add(btnCancel);
mainPanel.add(topBar, BorderLayout.NORTH);
// 中間:表單 - GridBagLayout 精確對齊
JPanel formPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5,5,5,5); gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 0; gbc.gridy = 0; formPanel.add(new JLabel("用戶名:"), gbc);
gbc.gridx = 1; gbc.weightx = 1.0; gbc.fill = GridBagConstraints.HORIZONTAL;
formPanel.add(txtUsername, gbc);
// ... 更多字段
mainPanel.add(new JScrollPane(formPanel), BorderLayout.CENTER);
// 底部:狀態欄 - BoxLayout 水平
JPanel bottomBar = new JPanel();
bottomBar.setLayout(new BoxLayout(bottomBar, BoxLayout.X_AXIS));
bottomBar.add(Box.createHorizontalGlue());
bottomBar.add(lblStatus);
mainPanel.add(bottomBar, BorderLayout.SOUTH);
weightx/weighty:GridBagLayout 中組件不隨視窗縮放,需至少一個方向權重 > 0getPreferredSize() 或調用 setPreferredSize() 干預JScrollPane 包裹內容面板add() 組件**前**設置 setLayout(),否則組件按預設佈局排列new MigLayout("", "[][grow][]", "[][]") 幾行搞定複雜佈局結論:調整 JPanel 組件位置,**首選嵌套佈局管理器**(BorderLayout 主結構 + 子面板專用佈局),輔以 EmptyBorder 微調間距。複雜表單強烈建議引入 MigLayout 或遷移 JavaFX。