绝对布局,顾名思义,就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。
使用绝对布局的步骤如下:
使用Container.setLayout(null)方法取消布局管理器。
使用Component.setBounds()方法设置每个组件的大小与位置
流布局管理器在整个容器中的布局正如其名,像“流”一样从左到右摆放组件,直到占据了这一行的所有空间,然后再向下移动一行。默认情况下,组件在每一行上都是居中排列的,但是通过设置也可以更改组件在每一行上的排列位置。
FlowLayout类中具有以下常用的构造方法:
public FlowLayout()
public FlowLayout(int alignment)
public FlowLayout(int alignment, int horizGap, int vertGap)
构造方法中的alignment参数表示使用流布局管理器后组件在每一行的具体摆放位置。alignment为0时,每一行的组件将被指定按照左对齐排列;alignment为2时,每一行的组件将被指定按照右对齐排列;alignment为1时,每一行的组件将被指定按照居中对齐排列;
horizGap与vertGap参数分别以像素为单位指定组件之间的水平间距与垂直间距。
在默认不指定窗体布局的情况下,Swing组件的布局模式是BorderLayout布局管理器。边界布局管理器可以将容器划分为东、南、西、北、中5个区域,可以将组件加入到这5个区域中。容器调用Container类的add()方法添加组件时可以设置此组件在边界布局管理器中的区域,区域的控制可以由BorderLayout类中的成员变量来决定,这些成员变量的具体含义如下表所示。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181201205124350.png)
网格布局管理器将容器划分为网格,所以组件可以按行和列进行排列。在网格布局管理器中,每一个组件的大小都相同,并且网格中的空格的个数由网格的行数和列数决定。组件从网格的左上角开始,按照从左到右、从上到下的顺序加入到网格中,而且每一个组件都会填满整个网格,改变窗体的大小,组件也会随之而改变大小。
Public GridLayout(int rows, int columns)
Public GridLayout(int rows, int columns, int horizGap, int vertGap)
Rows与columns参数代表网格的行数与列数,只能一个参数可以为0,代表一行或一列可以排列人一多个组件。horizGap与vertGap指定网格之间的间距。
由BoxLayout类实现的布局管理器称为箱式布局管理器,用来管理一组水平或垂直排列的组件,如果是用来管理一组水平排列的组件,则称为水平箱,如果是用来管理一组垂直排列的组件,则称为垂直箱。
BoxLayout类仅提供一个构造方法BoxLayout(Contaniner target, int axis) ,参数target为要采用该布局方式的容器对象,参数axis为要采用的布局方式,如设置为静态常量X_AXIS表示创建一个水平箱,组件从做到右排列,若为Y_AXIS则表示创建一个垂直箱,组件从上到下排列。无论是水平箱还是垂直箱,当窗体调小至不能显示所有组件时,组件仍会排列在一行或一列,组件按添加到容器中的先后顺序进行排列。
箱式布局在排列时,对于水平箱,会试图将所有组件的高度调整到最高组件的高度,如某一组件不能满足此要求,会根据该组件的垂直调整值(alignmentY )进行调整。对于垂直箱,
会试图将所有组件的宽度调整到最宽组件的宽度,如某一组件不能满足此要求,会根据该组件的垂直调整值(alignmentX)进行调整。(0.0,0.5,1.0)
默认情况下,有箱式布局管理器实现的组件之间没有间距,如果需要在组件之间设置间距你,可以通过使用Box类提供的六个不可见组件实现,这些组件事专门用来设置箱式布局的。
Box类以BoxLayout类为其布局管理器的轻量级容器,可分别通过静态方法createHorizontalBox() 和createVerticalBox() 获得水平或垂直布局管理器的箱式容器。在该类中提供了两种类型不可见组件,分别为支柱(Strut)类型和胶水(Glue)类型。
水平支柱 createHorizontalStrut(int width)
垂直支柱 createVerticalStrut(int height)
区域支柱 createRigidArea(Dimension d)
水平胶水 createHorizontalGlue()
垂直胶水 createVerticalGlue()
区域胶水 createGlue()
支柱类型的组件具有指定的宽度,高度和大小,通常用来设置组件间固定间距。
胶水类型的组件类似于一个弹簧,通常用来将组件平均分布到容器中。
卡片布局管理器
由CardLayout类实现的布局管理器称为卡片布局管理器,用来操纵其所管理容器中包含的容器或组件。每个直接添加到其所管理容器中的容器或组件为一个卡片,最先被添加到其所管理容器中的容器或组件被认为是第一个卡片,最后被添加的则为最后一个卡片,初次运行时将显示第一个卡片。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2018120120521014.png)
此五种方法均需要传入以个Container型的对象,该对象为布局管理器对象所管理的容器对象。
利用next()或previous()方法显示卡片时,将循环显示所有卡片。
使用show(Container parent, String name)方法显示卡片时,
则需要利用add(Componet comp,Object constraints)方法向其
所管理的容器中添加组件,其中入口参数parent为卡片对象,name为卡片的标签。
由GridBagLayout类实现的布局管理器称为网格组布局管理器,它实现了一个动态的矩形网格,这个矩形网格由无数个矩形单元格组成,每个组件可以占用一个或多个这样的单元格。所谓动态的矩形网格,就是可以根据实际需要随意增减矩形网格的行数和列数。
在向由GridBagLayout类管理的容器中添加组件时,需要为每个组件创建一个与之关联的GridBagConstraints类的对象,通过该类中的属性可以设置组件的布局信息,例如组件在网格组中位于第几行、第几列,以及需要占用几行几列等。
通过GridBagLayout类实现的矩形网格的绘制方向由容器决定,如果容器的方向是从左到右,则位于矩形网格左上角的单元格的列索引为0,此时组件左上角的点为起始点;如果容器的方向是从右到左,则位于矩形网格右上角的单元格的列索引为0,此时组件右上角的点为起始点。
GridBagLayout类中各个属性的功能和使用方法
gridx和gridy属性
这两个属性用来设置组件起始点所在单元格的索引值。需要注意的是,属性gridx设置的是X轴(即网格水平方向)的索引值,所以它表示的是组件起始点所在列的索引;属性gridy设置的是Y轴(即网格垂直方向)的索引值,所以它表示的是组件起始点所在行的索引。
gridwidth和gridheight属性
这两个属性用来设置组件占用网格组的行数和列数。属性gridwidth为组件占用网格组的列数,也可以理解为以单元格为单位组件的宽度;属性gridheight为组件占用网格组的行数,也可以理解为以单元格为单位组件的高度。
anchor属性
属性anchor用来设置组件在其所在显示区域的显示位置。通常将显示区域从方向上划分为9个方位,分别为北方(NORTH)、东北(NORTHEAST)、东方(EAST)、东南(SOUTHEAST)、南方(SOUTH)、西南(SOUTHWEST)、西方(WEST)、西北(NORTHWEST)和中心(CENTER)。
九个方位的单词是该类的静态常量,静态常量CENTER为默认值。
fill属性
属性fill用来设置组件的填充方式。当单元格显示区域的面积大于组件面积时,或者一个组件占用多个单元格时,显示组件可能不必占用所有显示区域,在这种情况下可以通过fill属性设置组件的填充方式。默认情况下是将该属性设置为静态常量NONE,即不调整组件大小至填满显示区域;HORIZONTAL为只调整组件水平方向的大小(即组件宽度)至填满显示区域;VERTICAL为只调整组件垂直方向的大小(即组件高度)至填满显示区域;BOTH为同时调整组件的宽度和高度至填满显示区域。
insets属性
属性insets用来设置组件四周与单元格边缘之间的最小距离。该属性的类型为Insets,Insets类仅有一个构造方法Insets(int top, int left, int bottom, int right),它的4个入口参数依次为组件上方、左侧、下方和右侧的最小距离,单位为像素,如下图所示,默认为没有距离。
ipadx和ipady属性
这两个属性用来修改组件的首选大小。属性ipadx用来修改组件的宽度,属性ipady用来修改组件的高度。如果为正数,则在首选大小的基础上增加指定的宽度和高度。如果为负数,则在首选大小的基础上减小指定的宽度和高度。
weightx和weighty属性
这两个属性用来设置网格组的每一行和每一列对额外空间的分布方式。在不设置属性weightx和weighty(即采用默认方式)的情况下,当窗体调整到足够大时,组件全部聚集在窗体的中央,在组件四周出现了大片的额外空间。通过这两个属性设置网格组的每一行和每一列对额外空间的分布方式可避免此现象。
这两个属性的默认值均为0,表示不分布容器的额外空间。属性weightx用来设置器所在列对额外空间的分布方式,如果该列中设置多个weightx属性,则取他们的最大值为该列的分布方式;weighty属性与之类似。
注:
在设置网格组的每一行和每一列对额外空间的分布方式时,只设置第一行的weightx属性和第一列的weighty属性,这样会方便前期调试和后期维护。
在设置网格组的每一行和每一列对额外空间的分布方式时,为各个属性按百分比取值。
使用弹簧布局管理器
弹簧布局管理器以容器和组件的边缘为操纵对象,通过为组件和容器边缘以及组件和组件边缘建立约束,实现对组件布局的管理。
通过putConstraint(String e1, Component c1,int pad, String e2, Component c2)方法可以为各个边之间建立约束。
C1需要参考的组件对象,e1需要参考的组件对象的具体需要参考的边
C2被参考的组件对象(也可以是需要参考的组件对象所属的容器对象)
e2被参考的组件的具体被参考的边,pad两条边之间的距离,即两组件的间距
注:当e2在e1的北侧或西侧时,pad为正数,当e2在e1的南侧或东侧时,则pad为负数,否则两条边将重叠。
参数e1和e2 可以冲该类提供的静态常量中选择
EAST East 表示组件东侧的边
SOUTH South 表示组件南侧的边
WEST West 表示组件西侧的边
NORTH North 表示组件北侧的边
使用弹簧和支柱
利用Spring类可以创建弹簧和支柱,但不是通过构造方法创建的,而是静态方法constant()
在利用方法constant(int min, int pref, int max) 创建弹簧时需要设置3个参数,分别为弹簧的最小值、首选值和最大值。最小值可以理解为弹簧被压缩到极限时的长度;首选值可以理解为弹簧自然放置情况下的长度;最大值可以理解为弹簧被拉伸到极限时的长度。如果这3个值相等,弹簧就没有了伸缩能力,也就变成了支柱,如果是创建支柱通常利用方法constant(int pref),因为它更方便。
通过方法width(Component c)和height(Component c)可以快速获得一个弹簧,它们的入口参数均为组件对象,所得弹簧的最小值、首选值、最大值和实际值,分别为指定组件最小值(minimumSize)、首选值(preferredSize)、最大值(maximumSize)和实际值(size)的宽度或高度。
弹簧的实际值,可理解为弹簧当前的长度
通过getValue()和setValue(int value)方法可获得和设置弹簧当前的长度。
max(Spring s1, Spring s2)
所得的弹簧的最小值、首选值和最大值,均为这两个弹簧相应值中相对较大的值
sum(Spring s1, Spring s2)
所得的弹簧的最小值、首选值和最大值,均为这两个弹簧相应值的和
scale(Spring s, float factor)
所得的弹簧的最小值、首选值和最大值,均为这两个弹簧相应值的factor倍
minus(Spring s)
所得的弹簧的最小值为指定弹簧最大值的负数,首选值为指定弹簧首选的负数
最大值为指定弹簧最小值的负数
以上四个方法,均用来根据指定条件获得一个新的弹簧。
使用弹簧建立约束
putConstraint(String e1, Component c1,int pad, String e2, Component c2)
putConstraint(String e1, Component c1, String s , String e2, Component c2)
利用弹簧控制组件大小
利用SpringLayout类的getConstraints(Component c)方法可以得到SpringLayout.Constraints类的对象,通过该类的方法setWidth(Spring width)和setHeight(Spring height)可以为组件的宽度和高度添加约束。