1. BoxLayout——盒式布局:
1) 这是Swing中新引入的一种布局,为了弥补GridBagLayout过于复杂的缺点;
2) 但其并不是一种GridBagLayout的替代品,而是结合前面的流式、方位式等形成更丰富灵活的布局模式,目的是为了和之前的布局模式嵌套组合;
3) 这里的盒子是一种单向布局盒子,一个盒子同时只能具有一种方向的排列,要么纵向要么横向(是指盒子中组件的排列方向,盒子就是使用盒式布局的容器);
4) 构造器:BoxLayout(Container target, int axis);
i. 这里就是创建一个机遇target容器的盒式布局管理器;
ii. axis是盒子中组件排列的方向,有两个BoxLayout的静态常量可以选择,一个是X_AXIS,即横向排列(从左向右),另一个是Y_AXIS,即纵向排列(从上到下);
5) 布局的设置过程例如:target.setLayout(new BoxLayout(target, BoxLayout.X_AXIS);
!!可以发现target被交叉引用了,因此AWT不是一个严格的面向对象编程手段,比较繁杂,因此会提出Swing工具;
6) 示例:创建了一个具有两个按钮的盒子
public class AwtTest { public static void main(String[] args) { Frame f = new Frame("BoxLayout Test"); f.setLayout(new BoxLayout(f, BoxLayout.Y_AXIS)); f.add(new Button("top")); f.add(new Button("bottom")); f.pack(); f.setVisible(true); } }
2. Box——盒式容器:
1) 是Swing中新引入的容器,顾名思义,它默认采用BoxLayou的盒式布局;
2) 构造器:Box(int axis); // axis仍然是BoxLayout的X_AXIS或者Y_AXIS
3) 但一般不直接使用其构造器,而是使用Box类的工厂制造方法create来创建容器实例:
i. Box createHorizontalBox(); // 返回一个横向盒
ii. Box createVerticalBox(); // 返回一个纵向盒
4) 构造完成之后就可以像1.那样正常地add组件了;
5) 但是Box构造器或者create方法不能指定水平或者垂直的间距,新颖的是Box提供了几种创造间距的方法,其中Box的间距有三种:
i. glue:即胶水,胶水有粘性和弹性,代表可以朝两个方向拉伸,一块儿胶水就代表一段可以朝两个方向伸缩的空白区域;
ii. strut:即支架,支架只能朝一个方向拉伸,另一个方向上的长度是固定的,比如水平支架就可以看做是一个竖放的弹簧,可以垂直伸缩,但是水平宽度保持不变,而垂直支架刚好相反,支架就是一种只能朝一个方向伸缩另一个方向不可伸缩的空白区域;
iii. rigid:刚体,即刚性体(刚性的空白区域),两个方向上都不能伸缩
6) 利用Box的create方法创建空白区域:
i. Component createHorizontalGlue(); // 创建一块胶,只能add进水平排列的Box中
ii. Component createVerticalGlue(); // 创建一块胶,只能add进垂直排列的Box中
iii. Component createHorizontalStrut(int width); // 创建一个宽度固定、可垂直伸缩的支架
iv. Component createVerticalStrut(int height); // 创建一个高度固定、可水平伸缩的支架
v. Component createRigidArea(Dimension d); // 创建一个刚性空白区域
!其中Dimension描述一个二维空间,构造器为:Dimension(int width, int height);
7) 示例:
public class AwtTest { public static void main(String[] args) { Frame f = new Frame("Box Test"); Box hBox = Box.createHorizontalBox(); Box vBox = Box.createVerticalBox(); hBox.add(new Button("1")); hBox.add(Box.createHorizontalGlue()); hBox.add(new Button("2")); hBox.add(Box.createHorizontalStrut(10)); hBox.add(new Button("3")); vBox.add(new Button("4")); vBox.add(Box.createVerticalGlue()); vBox.add(new Button("5")); vBox.add(Box.createVerticalStrut(10)); vBox.add(new Button("6")); f.add(hBox); f.add(vBox, BorderLayout.SOUTH); f.pack(); f.setVisible(true); } }!运行可以观察各个空白区域的伸缩情况;