BoxLayout与其他布局管理器稍有不同,必须向其构造函数中传递容器实例的引用,由该容器使用BoxLayout。另外必须指定BoxLayout 中组件的布局方式:垂直排列(按列)或水平排列(按行)。用水平组件和垂直组件的不同组合嵌套多面板的作用类似于 GridBagLayout,但没那么复杂。
BoxLayout 管理器是用 axis 参数构造的,该参数指定了将进行的布局类型。有四个选择:
X_AXIS :从左到右水平布置组件。
Y_AXIS :从上到下垂直布置组件。
LINE_AXIS :根据容器的 ComponentOrientation 属性,按照文字在一行中的排列方式布置组件。如果容器的 ComponentOrientation 表示水平,则将组件水平放置,否则将它们垂直放置。对于水平方向,如果容器的 ComponentOrientation 表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上到下放置的。
PAGE_AXIS :根据容器的 ComponentOrientation 属性,按照文本行在一页中的排列方式布置组件。如果容器的 ComponentOrientation 表示水平,则将组件垂直放置,否则将它们水平放置。对于水平方向,如果容器的 ComponentOrientation 表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上向下放置的。
eg:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
JPanel jp = new JPanel();
BoxLayout layout = new BoxLayout(jp,BoxLayout.X_AXIS);
jp.setLayout(layout);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
容器尺寸:如果使用垂直属性,容器高度为子组件高度之和,宽度为最宽子组件的宽度;使用水平属性,宽度为子组件宽度之和,高度为最高子组件的高度。
在这个例子中,一个 BoxLayout 布局管理器的实例 layout 被创建,这个实例被设置为 panel 的布局管理器,该布局管理器采用了水平排列来排列控件。
package ch9; import java.awt.Dimension; import javax.swing.*; public class BoxLayoutTest extends JFrame { JButton jb1 = new JButton("纵向按钮一"); JButton jb2 = new JButton("纵向按钮二"); JButton jb3 = new JButton("纵向按钮三"); JButton jb4 = new JButton("横向按钮一"); JButton jb5 = new JButton("横向按钮二"); JButton jb6 = new JButton("横向按钮三"); //private JButton[] jb = new JButton[]{jb1,jb2,jb3,jb4,jb5}; private Box box2 = Box.createHorizontalBox();//创建纵向Box容器 private Box box1 = Box.createVerticalBox();//创建横向Box容器 public BoxLayoutTest() { this.add(box1); box1.add(Box.createRigidArea(new Dimension(300,0)));//Dimension类只是用来封装单个对象中组件的宽度和高度,此处表示jb1上方的距离 box1.add(jb1); box1.add(Box.createVerticalStrut(20));//添加高度为20的垂直支架,也就是jb1和jb2之间的距离 box1.add(jb2); box1.add(Box.createVerticalStrut(20)); box1.add(jb3); box1.add(Box.createVerticalGlue()); box1.add(box2); box2.add(Box.createHorizontalGlue());//添加水平胶水,就是jb4与左边框的距离 box2.add(jb4); box2.add(Box.createHorizontalStrut(20)); box2.add(jb5); box2.add(Box.createHorizontalStrut(20)); box2.add(jb6); box2.add(Box.createHorizontalGlue());//添加水平胶水,就是jb6与右边框的距离 this.setTitle("箱式布局设置纵横两个箱子"); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setBounds(100,100,400,300); } public static void main(String args[]) { new BoxLayoutTest(); } }