一、背景
在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计。
java.awt 中定义了多种布局类,每种布局类对应一种布局策略。
常用布局类有五种:
- 流布局管理器 FlowLayout: 依次放置组件。
- 边界布局管理器 BorderLayout: 将组件放置在边界上。
- 箱式布局管理器 BoxLayout: 管理一组水平或垂直排列的组件。
- 卡片布局管理器 CardLayout: 将组件像扑克牌一样叠放,而每次只能显示其中一个组件。
- 网格布局管理器 GridLayout: 将显示区域按行、列划分成一个个相等的格子,组件依次放入这些格子中。
- 网格组布局管理器 GridBagLayout: 将显示区域划分成许多矩形小单元,每个组件可占用一个或多个小单元。
布局管理器是实现 LayoutManager 接口的类。
二、绝对布局
绝对布局是指硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。
例:
Container.setLayout(null) // 取消布局管理器。
Component.setBounds() // 设置每个组件的大小与位置
三、流布局管理器(FlowLayout)
FlowLayout 布局是将其中的组件按照加入的先后顺序从左到右排列,一行满之后就转到一下行继续从左到右排列,每一行中的组件都居中排列。
这种布局策略,一般用于组件不多的情况,当组件较多时,容器中的组件就会显得高低不平,各行长短不一。
常用构造方法:
public FlowLayout() // 默认布局
public FlowLayout(int alignment) // 参数设定对齐方式
// alignment 为 0 时,每一行的组件将被指定按照左对齐排列;
// alignment 为 2 时,每一行的组件将被指定按照右对齐排列;
// alignment 为 1 时,每一行的组件将被指定按照居中对齐排列;
public FlowLayout(int alignment, int horizGap, int vertGap)
// 参数分别表示 对齐方式、水平间距、垂直间距(以像素为单位)
四、边界布局管理器(BorderLayout)
BorderLayout 布局策略是把容器内的空间简单划分为东“East”, 西 “West”, 南 “South”, 北 “North”, 中 “Center” 五个区域。加入组件时,都应该指明把组件放在哪一个区域中,一个位置放一个组件。
如果某个位置要加入多个组件,应先将要加入该位置的组件放放另一个容器中,然后再将这个容器加入到这个个位置。
常用构造方法:
BorderLayout() // 默认布局: 默认情况下,没有间隙。
BorderLayout(int horz, int vert) // 设定组件之间的水平间距和垂直间距。
五、箱式布局管理器(BoxLayout)
如果是用来管理一组水平排列的组件,则称为水平箱;如果是用来管理一组垂直排列的组件,则称为垂直箱。
六、卡片布局管理器(CardLayout)
采用CardLayout布局的容器虽可容纳多个组件,但是多个组件拥有同一个显示空间,某一时刻只能显示一个组件。
每个直接添加到其所管理容器中的容器或组件为一个卡片,最先被添加到其所管理容器中的容器或组件被认为是第一个卡片,最后被添加的则为最后一个卡片,初次运行时将显示第一个卡片。就像一叠扑克牌每次只能显示最上面的一张一样,这个显示的组件将占据容器的全部空间。
七、网格布局管理器(GridLayout)
网格布局管理器将容器划分为网格,所以组件可以按行和列进行排列。在网格布局管理器中,每一个组件的大小都相同,并且网格中的空格的个数由网格的行数和列数决定。
组件从网格的左上角开始,按照从左到右、从上到下的顺序加入到网格中,而且每一个组件都会填满整个网格,改变窗体的大小,组件也会随之而改变大小。
Public GridLayout(int rows, int columns) // 参数表示行数和列数
// 只能一个参数可以为 0,代表一行或一列可以排列多个组件。
Public GridLayout(int rows, int columns, int horizGap, int vertGap)
// 参数表示 行数、列数、网格间距
GridLayout 布局以行为基准,当放置的组件个数超额时,自动增加列;反之,组件太少也会自动减少列,行数不变,组件按行优先顺序排列(根据组件自动增减列)。
GridLayout 布局的每个网格必须填入组件,如果希望某个网格为空白,可以用一个空白标签(add(new Label())) 顶替。
八、网格组布局管理器 GridBagLayout
由 GridBagLayout 类实现的布局管理器称为网格组布局管理器,它实现了一个动态的矩形网格,这个矩形网格由无数个矩形单元格组成,每个组件可以占用一个或多个这样的单元格。
所谓动态的矩形网格,就是可以根据实际需要随意增减矩形网格的行数和列数。
通过 GridBagLayout 类实现的矩形网格的绘制方向由容器决定:
如果容器的方向是从左到右,则位于矩形网格左上角的单元格的列索引为 0,此时组件左上角的点为起始点;
如果容器的方向是从右到左,则位于矩形网格右上角的单元格的列索引为 1,此时组件右上角的点为起始点。