布局管理器(六)——BoxLayout

        BoxLayout与其他布局管理器稍有不同,必须向其构造函数中传递容器实例的引用,由该容器使用BoxLayout。另外必须指定BoxLayout 中组件的布局方式:垂直排列(按列)或水平排列(按行)。用水平组件和垂直组件的不同组合嵌套多面板的作用类似于 GridBagLayout,但没那么复杂。

        BoxLayout 管理器是用 axis 参数构造的,该参数指定了将进行的布局类型。有四个选择:
X_AXIS
:从左到右水平布置组件。
Y_AXIS
:从上到下垂直布置组件。
LINE_AXIS
:根据容器的 ComponentOrientation 属性,按照文字在一行中的排列方式布置组件。如果容器的 ComponentOrientation 表示水平,则将组件水平放置,否则将它们垂直放置。对于水平方向,如果容器的 ComponentOrientation 表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上到下放置的。
PAGE_AXIS
:根据容器的 ComponentOrientation 属性,按照文本行在一页中的排列方式布置组件。如果容器的 ComponentOrientation 表示水平,则将组件垂直放置,否则将它们水平放置。对于水平方向,如果容器的 ComponentOrientation 表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上向下放置的。

        容器尺寸:如果使用垂直属性,容器高度为子组件高度之和,宽度为最宽子组件的宽度;使用水平属性,宽度为子组件宽度之和,高度为最高子组件的高度。
一个小例子如下:

import java.awt.*;
import javax.swing.*;

public class BoxLayoutTest {

	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e) {
		}
		JFrame frame = new JFrame("BoxLayout Test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container panel = frame.getContentPane();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
		for (float align = 0.0f; align <= 1.0f; align += 0.25f) {
			JButton button = new JButton("X align = " + align);
			button.setAlignmentX(align);
			panel.add(button);
		}
		frame.setSize(400, 300);
		frame.setVisible(true);
	}
}





 

         除BoxLayout之外,Swing中还包含Box类,该类提供BoxLayout所需功能。Box类是java.awt.Container的子类, 方便时可以将其实例用作可视组件,Box 类是使用 BoxLayout 的轻量级容器。它还提供了一些帮助,要获取想要的排列,将组件添加到多个嵌套的 box 中是一种功能强大的方法。因此许多程序使用 Box 类,而不是直接使用 BoxLayout。

        Box提供了很多静态工厂方法,用于创建各种组件实例,便于使用BoxLayout。Box工厂还能创建几种影响布局的透明组件,添加到 BoxLayout管理容器中的透明组件能够在其他组件之间形成间隔,这三种透明组件分别是: rigid(刚性组件)、glue(胶水组件)和struts(支柱组件)。
1.rigid:透明组件,该组件的最大尺寸和最小尺寸相等,即大小固定。创建时候必须先调用Box的createRigidArea(Dimension d)

for (float align = 0.0f; align <= 1.0f; align += 0.25f) {
			JButton button = new JButton("X align = " + align);
			button.setAlignmentX(align);
			panel.add(button);
                        panel.add(Box.createRigidArea(new Dimension(0, 15)));
}




    2.glue:透明组件,与刚性组件不同的是,胶水组件创建时不允许指定尺寸,因为胶水组件使用的是为占用的空间。创建胶水对象时调用的方法取决于所用的BoxLayout的方向,对于垂直方向应该调用 createVerticalGlue()对象,对于创建水平的容器则应该使用createHorizontalGlue()方法。胶水对象会填满容器中的所有多余的水平空间或者垂直空间,从而消除容器底部或右边的空白,且这些空间会被平均分配给胶水组件。

for (float align = 0.0f; align <= 1.0f; align += 0.25f) {
			JButton button = new JButton("X align = " + align);
			button.setAlignmentX(align);
			panel.add(button);
			panel.add(Box.createVerticalGlue());	
}




  3.strut:支柱组件与刚性区域相似,但有个重要区别,支柱仅指定单个方向的尺寸,而不同时候指定宽度 (createHorizontalStrut)和高度(createVerticalStrut),支柱将指定值作为柱长方向的最小尺寸、首选尺寸和最 大尺寸,而另一个方向的最小尺寸和首选尺寸都是0。Box会将令一个方向的最大尺寸设为较大值,这样的分配结果可能很不理想,确切的说,如果 BoxLayout中存在很大的支柱组件,则会使容器的分配尺寸大于容器的设计尺寸。由于刚性区域能能够提供相同的功能,且使用支柱组件可能会有潜在的问 题,所以应该避免使用支柱而换用刚性组件。

 

参考:

1. Pro Java Programming(Second Edition)

 2. Core Java I

你可能感兴趣的:(java,box,BoxLayout)