在Swing中,每个组件在容器中都有一个具体的位置和大小(注意参考对象是容器而不是屏幕),而在容器中摆放各种组件时很难判断其具体位置和大小。布局管理器提供了Swing组件安排、展示在容器中的方法及基本的布局功能,可以有效地处理整个窗体的布局。常见的布局管理器有流布局管理器、边界布局管理器、网格布局管理器、网格组布局管理器。
绝对布局(null)
在介绍布局管理器之前先介绍绝对布局,绝对布局就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。在绝对布局中,组件的位置和大小是绝对的,组件的位置和大小不会随着窗体的大小改变而改变(如图甲和乙)。
设置绝对布局的语法是:“容器名.setLayout(null);”
在绝对布局中使用“组件名.setBounds(x,y,width,height)”来设置组件的位置和大小。
示例如下:
图甲
图乙
流布局管理器(FlowLayout)
流布局管理器是最基本的布局管理器,在整个容器中的布局像“水”一样从左到右摆放组件,直到占据了这一行的所有空间,然后向下移动一行,当窗体大小改变时,组件也会做相应的变化(如图甲和乙)。在默认情况下,组件在每一行都是居中排列的,可以通过设置来改变组件在每一行的排列方式(如图丙)。
设置流布局的语法:“容器名.setLayout(new FlowLayout(FlowLayout.排列方式));” 没有排列方式则默认居中
图甲
图乙
如果不使用默认的排列方式,可以在设置布局的方法中添加参数来改变:
FlowLayout.LEFT:按左对齐排列;
FlowLayout.CENTER:居中对齐排列;
FlowLayout.RIGHT:按右对齐排列;
图丙
边界布局管理器(BorderLayout)
边界布局是容器的默认的布局模式,边界布局分为“东南西北中”五个区域,如图所示:
设置边界布局的语法:“容器名.setLayout(new BorderLayout());”
而边界布局的add留有不同:“容器名.add(组件,区域常量);”不加区域常量也可以,但会默认为中区域。
区域常量如下:
BorderLayout.WEST:东区;
BorderLayout.SOUTH:男区;
BorderLayout.EAST:西区;
BorderLayout.NORTH:北区;
BorderLayout.CENTER:中区;
网格布局管理器(GridLayout)
网格布局管理器将容器划分为网格,所以组件可以按行和列进行排序。在网格布局中,每个组件的大小都相同,并且网格中空格的个数由网格的行数和列数决定。组件从左到右、从上到下的顺序加入到网格中,而且每一个组件会填满整个网格,改变窗体的大小,组件的大小也随之改变(如图甲)。
设置网格布局的语法:“容器名.setLayout(new GridLayout(int x1,int x2,int x3,int x4));”
参数解释如下:
x1:网格的行数;
x2:网格的列数;
x3:网格之间的水平距离;
x4:网格之间的垂直距离;
如果“x3”或者“x4”或者“x3和x4”没有声明,则默认为0;
如果需要的组件数超过了网格数,就会自己做一定的调整,如下图:
网格组布局管理器(GridBagLayout)
网格组布局实现了一个动态的矩形网格,使这个矩形网格由无数个矩形单元组成,每个组件可以占用一个或多个这样的单元格,可以根据实际需求增减矩形网格的行数和列数。在向网格组布局容器添加组件时,需要创建一个与之关联的GridBagConstraints类对象用来约束组件。
常用约束属性:
gridx(x轴位置)和gridy(y轴位置)属性:

gridwidth(高)和gridheight(宽)属性(在上述代码基础上添加并调用method_2方法):

运行结果:
fill属性:
组件有四种填充属性(如图):
HONE(默认填充):不调整组件大小,组件居中(默认的anchor属性),为默认方式;
HORIZONTAL(水平填充):调整组件水平方向的大小(即宽度)至填满指定宽度;
VERTICAL(垂直填充):调整组件垂直方向的大小(即高度)至填满指定高度;
BOTH(饱满填充):调整组件大小至指定高度和宽度;
使用语法:“GridBagConstraints类对象.fill=GridBagConstraints.填充方式;”
实例如下:
运行结果:
anchor属性:
该属性用于设置组件在其显示区域的显示位置,分为九个方向(默认是CENTER),如图所示:
实例如下:
然后东南显示:
insets属性:
insets属性是自定义显示位置,如果上述的九种显示位置不满意,可以自己定义显示的位置
insets是一个类,需要创建对象,创建对象是的四个参数就对应上述的四个int型数据
ipadx(组件宽度)和ipady(组件高度)属性:
ipadx>0:在默认宽度下增加宽度;
ipadx<0:在默认宽度下减小宽度;
ipady>0:在默认高度下增加高度;
ipady<0:在默认高度下减小高度;
示例如下:

weightx和weighty属性(体会一下,不太懂):
没有weightx和weighty:
有weightx和weighty:
