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);
	}

}
!运行可以观察各个空白区域的伸缩情况;

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐