JAVA 布局管理器

New Document 组件在容器中的位置和尺寸是由布局管理器来决定的。所有的容器都会引用一个布局管理器实例,通过它来自动进行组件的布局管理。
默认布局管理器
当一个容器被创建后,它们有相应的默认布局管理器。Window、Frame和Dialog的默认布局管理器是BorderLayout,Panel和
Applet的默认布局管理器是FlowLayout。 可以通过setLayout()方法来重新设置容器的布局管理器。例如把一个Frame的布局管理器设为FlowLayout。

Frame f=new Frame("hello"); f.setLayout(new FlowLayout());

取消布局管理器
如果不希望通过布局管理器来管理布局,可以调用容器的setLayout(null)方法, 这样布局管理器就被取消了。
接下来必须调用容器中每个组件的setLocation()、setSize()、或setBounds()方法,为这些组件在容器中一一定位。
和布局管理器管理方式不同的是,这种手工布局将导致图形界面的布局不再是和平台无关的。相反,图形界面的布局将依赖于操作系统环境。

布局管理器种类
java.awt包提供了5种布局管理器:FlowLayout 流式布局管理器、Borderlayout 边界布局管理器、GridLayout 网格布局管理器、Cardlayout 卡片 布局管理器和GridBagLayout网格包布局管理器。另外javax.swing包还提供了一种BoxLayout 布局管理器。

FlowLayout 流式布局管理器
FlowLayout 是最简单的布局管理器,按照组件的添加次序将它们从左到右地放置在容器中。当到达容器边界时,组件将放置在下一行中。
FlowLayout 运行以左对齐、 居中对齐(默认方式)或右对齐的方式排列组件。

FlowLayout的特性如下: 不限制它所管理的组件的大小,而是允许它们有自己的最佳大小。 当容器被缩放时,组件的位置可能会变化,但组件的大小不改变。 FlowLayout的构造方法如下:

  • FlowLayout();
  • FlowLayout(int align);
  • FlowLayout(int align,int hgap,int vgap);


参数align用来决定组件在每行中相对于容器的边界的对齐方式,可选值有:FlowLayout.LEFT(左对齐)、
FlowLayout.RIGHT(右对齐)和FlowLayout.CENTER(居中对齐)。参数hgap和参数vgap 分别设定组件之间的水平和垂直间隙。

BorderLayout边界布局管理器
BorderLayout为在容器中放置组件提供了一个稍微复杂的布局方案。BorderLayout把容器分为5个区域:东、南、西、北和中。
北占据容器的上方,东占据容器的右侧,依次类推。中区域是在东、南、西和北都填满后剩下的区域。
BorderLayout的特性如下:

  • 在位于东和西区域的组件保持最佳宽度,高度被垂直拉伸至和所在区域一样高; 位于南和北区域的组件保持最佳高度,宽度被水平拉伸至和所在区域一样宽; 位于中区域的组件的宽度和高度都被拉伸至和所在区域一样的大小。
  • 当窗口垂直拉伸时,东、西和中区域也拉伸;而当窗口水平拉伸时,南、北和中区域也拉伸;
  • 对于容器的东、南、西和北区域,如果某个区域没有组件,则这个区域面积为零;对于中区域,不管有没有 组件,BorderLayout都会为它分配空间,如果该区域没有组件,在中区域显示容器的背景颜色。
  • 当容器被缩放时,组件所在的相对位置不变,但组件大小改变。
  • 如果在某个区域添加的组件不止一个,则只有最后添加的一个是可见的。


BorderLayout的构造方法如下:

  • BorderLayout()
  • BorderLayout(int hgap,int vgap)


参数hgap和参数vgap分别设定组件之间的水平和垂直间隙。
对于采用BorderLayout的容器,当它用add()方法添加一个组件时,可以同时为组件指定在容器中的区域。

void add(Component comp,Object constraints)
这里的 constraints是 String类型,可选值为BorderLayout提供的5个常量。

  • Borderlayout.NORTH:北区域,值为"North"。
  • Borderlayout.SOUTH:南区域,值为"South"。
  • Borderlayout.EAST:东区域,值为"East"。
  • Borderlayout.WEST:西区域,值为"West"。
  • Borderlayout.CENTER:中区域,值为"Center"。


Frame的默认布局管理器就是BorderLayout。以下代码把Button方在Frame的北区域。

Frame f=new Frame("Test");
f.add(new Button("b1",BorderLayout>NORTH));
//或者;f.add(new Button("b1","North"));

如果不指定add()方法的constraints参数,在默认情况下把组件放在中区域。以下代码向Frame的
中区域加入两个Button,但是只有最后加入的Button是可见的。

Frame f=new Frame("Test");
f.add(new Button("b1"));
f.add(new Button("b2"));
f.setSize(100,100);
f.setVisible(true);

在Frame中只有b2按钮是可见的,它占据了Frame的中区域,由于其他区域没有组件,因此其他区域的面积都为零
,b2按钮自动向垂直和水平方向拉伸,占据了Frame的整个空间。

Gridlayout网格布局管理器
GridLayout将容器分割成许多行和列,组件被填充到每个网格中。添加到容器中的组件首先放置在左上角的网格中,
然后从左到右放置其他组件,直至占满该行的所以网格,接着继续在下一行中从左到右放置组件。

GridLayout的特性如下:

  • 组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变。组件始终占据网格的整个区域。 GridLayout总是忽略组件的最佳大小,所以组件的宽度相同,高度也相同。
  • 将组件用add()方法添加到容器中的先后顺序决定它们占据哪个网格。
  • GridLayout从左到右、从上到下将组件填充到容器的网格中。


GridLayout的构造方法如下:

  • GridLayout()
  • GridLayout(int rows,int cols)
  • GridLayout(int rows,int cols,int hgap,int vgap)


参数rows代表行数,参数cols代表列数。参数hgap和vgap规定水平和垂直方向的间隙。水平间隙是指网格之间的水平距离,
垂直间隙是指网格之间的垂直距离。

CardLayout卡片布局管理器
CardLayout将界面看做一系列的卡片,在任何时候只有其中一个卡片是可见的,
这张卡片占据容器的整个区域。CardLayout的构造方法如下:

  • Cardlayout()
  • Cardlayout(int hgap,int vgap)


参数hgap表示卡片和容器的左右边界之间的间隙,参数vgap表示卡片和容器的上下边界的间隙。
对于采用Cardlayout的容器,当用add()方法添加一个组件时,需要同时为组件指定所在卡片的名字。

void add(Component comp,Object constraints)

以上constraints参数是一个字符串,表示卡片的名字。在默认的情况下,容器显示第一个用add()方法加入到
容器中的组件,也可以通过CardLayout的show(Container parent,String name)方法指定显示哪张卡片,参数
parent指定容器,参数name指定卡片的名字。

GridBagLayout网格包布局管理器
GridBagLayout在网格的基础上提供更为复杂的布局,和GridLayout不同,GridBagLayout允许容器中各个
组件的大小各不相同,还允许单个组件所在的显示区域占据多个网格。
使用GridBagLayout布局管理器的步骤如下:
(1)创建GridBagLayout布局管理器,并使容器采用该布局管理器。
GridBagLayout layout =new GridBagLayout();
container.setlayout(layout);
(2)创建一个GridBagConstraints对象。
GridBagConstraints constraints=new GridBagConstraints();
(3)为第一个添加到容器中的组件设置GridBagConstraints的各种属性。
constraints.gridx=1; //设置网络的左上角的x坐标
constraints.gridy=1; //设置网络的左上角的y坐标
constraints.gridwidth=1; //设置网络的宽度
constraints.gridheight=1; //设置网络的高度
(4)通知布局管理器放置第一个组件时的GridBagConstraints信息。
layout.setConstraints(component1,constraints);
(5)向容器中添加第一个组件。
container.add(component1);
(6)重复步骤(3)~步骤(5),将每个组件都添加到容器中。

GridBagConstraints包含了如何把一个组件添加到容器中的布局信息。只需要创建一个GridBagConstraints对象,
在每次向容器中加入组件时,先设置GridBagConstraints对象的属性,这个GridBagConstraints对象可以被多次 重用。
GridBagConstraints具有以下属性。
(1)gridx和gridy:这些属性指定了组件的显示区域的左上角的列和行。如果把gridx或gridy设为GridBagConstraints
.RELATIVE(默认值),表示当前组件紧跟在上一个组件的后面。
(2)gridwidth和gridheight:这些属性指定了组件的显示区域占据的列数和行数,默认值为1.如果把Gridwidth或
gridheigth设为GridBagConstraints.REMAINDER,表示当前组件在其行或列上为最后一个组件。如果把gridwidth或gridheight
设为GridBagConstraints.RELATIVE,表示当前组件在其行或列上为倒数第二个组件。
(3)fill:该属性在某组件的显示区域大于它所要求的大小时被使用。fill决定了是否及如何改变组件的大小,有效值包括:

  • GridBagConstraints.NONE-默认,不改变组件的大小。
  • GridBagConstraints.HORIZONTAL-使组件足够大,以填充其显示区域的水平方向,但不改变其高度。
  • GridBagConstraints.VERTICAL-使组件足够大,以填充其显示区域的垂直方向,但不改变其宽度。
  • GridBagConstraints.BOTH-使组件足够大,以填充其整个显示区域。


(4)ipadx和ipady:这些属性指定了内部填充的大小,即在该组件的最小尺寸基础上还需要增加多少。
组件的宽度必须至少为其最小宽度加ipadx×2个像素(因为填充作用于组件的两边)。同样,组件的高度必须至少为其最小高度加ipady×2个像素。
(5)insets:该属性指定了组件的外部填充大小,即组件与其显示区域边界之间的最小空间大小。
(6)anchor:该属性在某组件大小小于其显示区域时使用。anchor决定了组件放置在该区域中的位置。有效值包括;

  • GridBagConstraints.CENTER(默认值)
  • GridBagConstraints.NORTH
  • GridBagConstraints.NORTHEAST
  • GridBagConstraints.EAST
  • GridBagConstraints.SOUTHEAST
  • GridBagConstraints.SOUTH
  • GridBagConstraints.SOUTHWEST
  • GridBagConstraints.WEST
  • GridBagConstraints.NORTHWEST。


(7)weightx和weighty:weightx属性称为水平重量,weightty属性称为垂直重量,
它们用来决定如何布置容器中多于的水平方向和垂直方向的空白区域。除非为一行
(weightx)和一列(weighty)中的至少一个组件指定了重量,否则,所有组件都会集中
在容器的中央,这是因为当重量为0(默认值)时,GridBagLayout把所有空白区域放在
组件的显示区域和容器边界之间。

你可能感兴趣的:(JAVA)