BoxLayout 允許組件沿單一軸向 (水平或垂直) 排列,比 FlowLayout 更靈活,且不像 GridBagLayout 那麼複雜。它需在建構時指定目標容器與軸向,常與 Box 容器配合建立彈性間距。
public BoxLayout(Container target, int axis)
// 四種軸向常數
BoxLayout.X_AXIS // 左到右 (水平)
BoxLayout.Y_AXIS // 上到下 (垂直)
BoxLayout.LINE_AXIS // 依 ComponentOrientation 決定行方向
BoxLayout.PAGE_AXIS // 依 ComponentOrientation 決定頁面流向
getAxis():取得軸向getTarget():取得目標容器getLayoutAlignmentX/Y(Container):取得對齊方式BoxLayout 依據組件的 setAlignmentX/Y(float) 對齊 (0.0=左/上, 0.5=置中, 1.0=右/下)。垂直佈局看 X 對齊,水平佈局看 Y 對齊。
import javax.swing.*;
import java.awt.*;
public class BoxLayoutDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }
catch (Exception ignored) {}
JFrame frame = new JFrame("BoxLayout Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = frame.getContentPane();
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
// 不同對齊方式的按鈕
for (float align = 0.0f; align <= 1.0f; align += 0.25f) {
JButton btn = new JButton("X Alignment = " + align);
btn.setAlignmentX(align);
pane.add(btn);
}
// 加入彈性空間
pane.add(Box.createVerticalGlue());
pane.add(new JButton("底部按鈕 (Glue 將其推至底部)"));
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
}
Box verticalBox = Box.createVerticalBox();
verticalBox.add(new JLabel("頂部標籤"));
verticalBox.add(Box.createRigidArea(new Dimension(0, 10))); // 固定間距
verticalBox.add(new JButton("中間按鈕"));
verticalBox.add(Box.createVerticalGlue()); // 彈性空間,佔據剩餘區域
verticalBox.add(new JLabel("底部標籤"));
Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createHorizontalGlue());
horizontalBox.add(new JButton("右對齊按鈕"));
結合水平與垂直 Box 可實現類似 GridBagLayout 的效果:
Box mainBox = Box.createVerticalBox();
Box row1 = Box.createHorizontalBox();
row1.add(new JLabel("姓名:"));
row1.add(Box.createHorizontalStrut(10));
row1.add(new JTextField(15));
mainBox.add(row1);
mainBox.add(Box.createVerticalStrut(10));
Box row2 = Box.createHorizontalBox();
row2.add(new JLabel("郵箱:"));
row2.add(Box.createHorizontalStrut(10));
row2.add(new JTextField(15));
mainBox.add(row2);
Box.createVertical/HorizontalBox() 建立中繼容器,避免直接在 JFrame contentPane 佈局。RigidArea (固定間距)、Glue (彈性間距)、Strut (單向間距)。setAlignmentX/Y 確保視覺對齊一致。MigLayout (第三方) 或 GridBagLayout。SwingUtilities.invokeLater。