应用布局管理器都属于相对布局,各组件位置可随界面大小而相应改变,不变的只是其相对位置,布局管理器比较难以控制,一般只在界面大小需要改是才用,但即使这样,为了操作方便,也只是在大的模块下用布局管理器,在一些小的模块下还是用绝对布局。在一些没要求界面大小改变的窗口,一般采用绝对布局比较容易,但对于后期的修改来说比较麻烦。
这种布局管理器分为东、南、西、北、中心五个方位。北和南的组件可以在水平方向上拉伸;而东和西的组件可以在垂直方向上拉伸;中心的组件可同时在水平和垂直方向上同时拉伸,从而填充所有剩余空间。在使用BorderLayout的时候,如果容器的大小发生变化,其变化规律为:组件的相对位置不变,大小发生变化。例如容器变高了,则North、South 区域不变,West、Center、East区域变高;如果容器变宽了,West、East区域不变,North、Center、South区域变宽。不一定所有的区域都有组件,如果四周区域(West、East、North、South区域)没有组件,则由Center区域去补充,但是如果 Center区域没有组件,则保持空白。BorderLayout是RootPaneContainer(JInternalFrame、JDialog、JFrame、JWindow)的默认布局管理器。
1 import java.awt.*; 2 public class buttonDir{ 3 public static void main(String args[]){ 4 Frame f = new Frame("BorderLayout"); 5 f.setLayout(new BorderLayout()); 6 f.add("North", new Button("North"); 7 //第一个参数表示把按钮添加到容器的North区域 8 f.add("South", new Button("South"); 9 //第一个参数表示把按钮添加到容器的South区域 10 f.add("East", new Button("East"); 11 //第一个参数表示把按钮添加到容器的East区域 12 f.add("West", new Button("West"); 13 //第一个参数表示把按钮添加到容器的West区域 14 f.add("Center", new Button("Center"); 15 //第一个参数表示把按钮添加到容器的Center区域 16 f.setSize(200,200); 17 f.setVisible(true); 18 } 19 }
该布局称为流式布局管理器,是从左到右,中间放置,一行放不下就换到另外一行。一行能放置多少组件取决于窗口的宽度。默认组件是居中对齐,可以通过FlowLayout(intalign)函数来指定对齐方式,默认情况下是居中(FlowLayout.CENTER)。FlowLayout为小应用程序(Applet)和面板(Panel)的默认布局管理器。其构造函数示例为:
这种布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,它把容器分成许多层,每层的显示空间占据整个容器大小,但是每层只允许放置一个组件,当然每层都可以利用Panel来实现复杂的用户界面。CardLayout就象一副叠得整整齐齐的扑克牌一样,有54张牌,但是你只能看见最上面的一张牌,一张牌就相当于布局管理器中的一层。 所有的组件像卡片一样叠在一起,每时每刻都只能显示其中一张卡片。CardLayout常用到切换界面。例如,点击App的Menu之后或者某个Button之后,主界面会切换到另外一个界面,这个时候就需要CardLayout。其实现过程如下:
panelTwo.setLayout(new GridLayout(2,1));
CardLayout card = new CardLayout();
panelMain.setLayout(card);
panelMain.add("red panel",panelOne);
panelMain.add("blue panel",panelOne);
card.first(panelMain); //第一个
card.last(panelMain); //最后一个
card.show(panelMain,"red panel"); //特定面板
这种布局是网格式的布局,窗口改变的时候,组件的大小也会随之改变。每个单元格的大小一样,而且放置组件时,只能从左到右、由上到下的顺序填充,用户不能任意放置组件。如果改变大小, GridLayout将相应地改变每个网格的大小,以使各个网格尽可能地大,占据Container容器全部的空间。
new GridLayout(行数,列数);
GridLayout(int row,int col)
GridLayout(int row,int col,int horz,int vert)
BoxLayout布局能够允许将控件按照X轴(从左到右)或者Y轴(从上到下)方向来摆放,而且沿着主轴能够设置不同尺寸。 构造BoxLayout对象时,有两个参数,例如:
1 JPanel jpanel=new JPanel(); 2 3 Jpanel.setLayout(new BoxLayout(jpanel,BoxLayout.Y_AXIS); 4 5 TextArea testArea=new TextArea(4,20); 6 7 JButton button=new JButton(“this is a button”); 8 9 jpanel.add(testArea); 10 11 jpanel.add(button);
//容纳testArea和button的容器,对他们沿Y轴(从上往下)放置,并且文本域和按纽左对齐,也就是两个控件的最左端在同一条线上。
1 testArea.setAlignmentX(Component.LEFT_ALIGNMENT); 2 3 button. setAlignmentX(Component.LEFT_ALIGNMENT);
//容纳testArea和button的容器,对他们采用沿Y轴(从上往下)放置,并且文本域最左端和按纽的最右端在同一条线上。
1 testArea.setAlignmentX(Component.LEFT_ALIGNMENT); 2 3 button. setAlignmentX(Component.RIGHT_ALIGNMENT);
setAlignmentX(left,right)只有在布局是BoxLayout.Y_AXIS才效,而setAlignmentY(top,button)在布局为BoxLayout.X_AXIS才效果。
组件对齐一般来说:
所有top-to-bottom BoxLayout object 应该有相同的 X alignment。
所有left-to-right Boxlayout应该有相同的 Y alignment
setAlignmentX 和setAlignmentY 可以实现对齐。
可以完成复杂的布局,而且IDE对它有足够的支持,是一个很强大的Layout。不过它过于复杂,在此布局中,组件大小不必相同。可以采用以下代码容器获得一个GridBagLayout:
ContainerName.setLayout(gb);
2) 创建GridBagContraints的一个实例
3) 为组件设置约束.
4) 通过方法统治布局管理器有关组件及其约束等信息
5) 将组件添加到容器.
6) 对各个将被显示的组件重复以上步骤.
指定组件放在哪个单元中。其值应该设为常数CridBagConstraints.RELATIVE 。然后按标准顺序将组件加入网格包布局。从左到右,从上到下。
2) gridwidth,gridheight
指定组件将占用几行几列
3) weightx,weighty
指定在一个GridBagLayout中应如何分配空间。缺省为0。
4) ipadx,ipady
指定组件的最小宽度和高度。可确保组件不会过分收缩。
5) fill
指定在单元大于组件的情况下,组件如何填充此单元,缺省为组件大小不变,以下为静态数据成员列表,它们是fill变量的值。
GridBagConstraints.NONE 不改变组件大小
GridBagConstraints.HORIZONTAL 增加组件宽度,使其水平填充显示区域
GridBagConstraints.VERTICAL 增加组件高度,使其垂直填充显示区域
GridBagConstraints.BOTH 使组件填充整个显示区域
6) anchor
如果不打算填充可以通过anchor指定将组件放置在单元中的位置,缺省为将其放在单元的中部。可使用以下静态成员:
GridBagConstraints.CENTER
GridBagConstraints.NORTH
GridBagConstraints.EAST
GridBagConstraints.WEST
GridBagConstraints.SOUTH
GridBagConstraints.NORTHEAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.NORTHWEST
GridBagConstraints.SOUTHWEST
使用setConstraints()方法可以设置各组件约束。
变量名 |
有效值 |
应用范围 |
定义 |
anchor |
CENTER EAST NORTH NORTHEAST SOUTH SOUTHWEST WEST |
组件 |
组件在网格中排放的位置 |
fill |
BOTH HORIZONTAL VERTICAL NONE |
组件 |
组件填充网格的方式 |
gridx,gridy |
RELATIVE 整数X,Y值 |
组件和显示区 |
组件的左上角网格的位置 |
gridheight gridwidth |
1 RELATIVE REMAINDER 宽,高度整数值 |
显示区 |
网格单元中组件显示区所占的高度和宽度 |
Insets |
(0,0,0,0) |
组件和显示区 |
外部填充 |
ipadx,ipady |
0 |
组件和显示区 |
内部填充 |
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.ipadx = 3;
gridBagConstraints.insets = new java.awt.Insets(3, 0, 3, 0);
pnlContent.add(btn, gridBagConstraints)
这种管理器把容器划分为行和列,就像是电子表格中的单元格。Tablelayouot把行和列交叉的每一个格子称为基本的单元格(cell)。组件被添加到容器划分好的单元格中。当容器发生改变(伸缩)时,单元格也随之伸缩,装载在单元格里的组件也相应的会进行伸缩。
TableLayout行列的分配
(1)、虽然Tablelayout它不是JDK自带的,但是它是开源的。Tablelaout作为开源的布局框架,可以对核心的类TableLayout.java进行修改达到自己所需要的功能实现。Tablelayout布局与html中表格基本是一样的,我们可以任意而且轻易地合并单元格,可以完成很复杂的布局。
(2)、当窗口的大小发生改变时,在tableLayout布局下得组件也会自动改变,按%比来分配每行,每列的大小。
(3)、TableLayout简单明了,不需要过多设置属性值,也能布局到复杂的外观,而不像GridBagLayout那样需要设置很多的属性(gridx、gridy、insets等等)过于复杂。