JAVA的界面布局原理:由于Java是跨平台语言,使用绝对坐标显然会导致问题,即在不同平台、不同分辨率下的显示效果不一样。Java 为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的全部组件安排给一个“布局管理器”负责管理,如:排列顺序,组件的大小,位置等,当窗体移动或调整大小后组件怎样变化等功能授权给相应的容器布局管理器来管理,不同的布局管理器使用不同算法和策略,容器可以通过选择不同的布局管理器来决定布局。 Java中一共同拥有6种布局管理器,通过使用6种布局管理器组合,可以设计出复杂的界面,并且在不同操作系统平台上都可以有一致的显示界面。6种布局管理器各自是BorderLayout、BoxLayout、FlowLayout、GirdBagLayout、GirdLayout和 CardLayout。当中CardLayout必须和其它5种配合使用,不是特别经常使用的。每种界面管理器各司其职,都有各自的作用。
CardLayout(卡式布局)
CardLayout布局管理器可以帮助用户处理两个以至很多其它的成员共享同一显示空间,它把容器分成很多层,每层的显示空间占领整个容器的大小,可是每层仅仅同意放置一个组件,当然每层都可以利用Panel来实现复杂的用户界面.布局管理器(CardLayout)就象一副叠得整整齐齐的扑克牌一样,有54张牌,可是你仅仅能看见最上面的一张牌,每一张牌就相当于布局管理器中的每一层.事实上现步骤例如以下:
首先,定义面板,为个个面板设置不同的布局,并依据须要在每一个面板中放置组件:
panelOne.setLayout(new FlowLayout);
panelTwo.setLayout(new GridLayout(2,1));
再设置主面板.
CardLayout card = new CardLayout();
panelMain.setLayout(card);
下一步将開始准备好的面板加入到主面板
panelMain.add("red panel",panelOne);
panelMain.add("blue panel",panelOne);
add()方法带有两个參数,第一个为String类型用来表示面板标题,第二个为Panel对象名称.
完毕以上步骤以后,必须给用户提供在卡片之间进行选择的方法.一个经常使用的方法是每张卡片都包括一个button.通经常使用来控制显示哪张面板.actionListener被加入到button..actionPerformed()方法可定义显示哪张卡片.:
card.next(panelMain); //下一个
card.previous(panelMain); //前一个
card.first(panelMain); //第一个
card.last(panelMain); //最后一个
card.show(panelMain,"red panel"); //特定面板
BorderLayout布局管理器:BorderLayout 也是一种很easy的布局策略,它把容器内的空间简单地划分为东、西、南、北、中无个区域,没加入一个组件都应该指明把这个组件加在哪个区域中。 BorderLayout是顶层容器( JFrame, JDialog, 和 JApplet )的默认布局管理器。有五个位置组件:
这个界面最多仅仅能显示5个控件。加入控件的时候,可以指定加入的方位,默认的情况是加入到中间。在BorderLayout中整理尺寸是,四周的控件会被调整,调整会依照布局管理器的内部规则计算出应该占多少位置,然后中间的组件会占去剩下的空间。
BorderLayout 是Window,Frame和Dialog的缺省布局管理器. BorderLayout布局管理器把容器分成5个区域:North,South,East,West和Center,每一个区域仅仅能放置一个组件.在使用 BorderLayout的时候,假设容器的大小发生变化,其变化规律为:组件的相对位置不变,大小发生变化.比如容器变高了,则North、South 区域不变,West、Center、East区域变高;假设容器变宽了,West、East区域不变,North、Center、South区域变宽.不一定全部的区域都有组件,假设四周的区域(West、East、North、South区域)没有组件,则由Center区域去补充,可是假设 Center区域没有组件,则保持空白.
演示样例:
import java.awt.*;
public class buttonDir{
public static void main(String args[]){
Frame f = new Frame("BorderLayout");
f.setLayout(new BorderLayout());
f.add("North", new Button("North");
//第一个參数表示把button加入到容器的North区域
f.add("South", new Button("South");
//第一个參数表示把button加入到容器的South区域
f.add("East", new Button("East");
//第一个參数表示把button加入到容器的East区域
f.add("West", new Button("West");
//第一个參数表示把button加入到容器的West区域
f.add("Center", new Button("Center");
//第一个參数表示把button加入到容器的Center区域
f.setSize(200,200);
f.setVisible(true);
}
}
FlowLayout布局管理器:流式布局管理器把容器看成一个行集,好象平时在一张纸上写字一样,一行写满就换下一行。行高是用一行中的控件高度决定的。FlowLayout是全部 JApplet/JApplet的默认布局。在生成流式布局时可以指定显示的对齐方式,默认情况下是居中(FlowLayout.CENTER)。在以下的演示样例中,可以用例如以下语句指定居左
JPanel panel= new JPanel(new FlowLayout(FlowLayout.LEFT)));
此为小应用程序(Applet)和面板(Panel)的缺省布局管理器,组件从左上角開始,按从左至右的方式排列.其构造函数为:
FlowLayout() //生成一个默认的流式布局,组件在容器里居中,每一个组件之间留下5个像素的距离.
FlowLayout(int alinment) //可以设定每行组件的对齐方式.
FlowLayout(int alignment,int horz,int vert) //设定对齐方式并设定组件水平和垂直的距离.
当容器的大小发生变化时,用FlowLayout管理的组件会发生变化,其变化规律是:组件的大小不变,可是相对位置会发生变化.
GirdLayout布局管理器:GridLayout 将成员按网格型排列,每一个成员尽可能地占领网格的空间,每一个网格也相同尽可能地占领空间,从而各个成员按一定的大小比例放置。假设你改变大小, GridLayout将相应地改变每一个网格的大小,以使各个网格尽可能地大,占领Container容器全部的空间。
基本布局策略是把容器的空间划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小区域中,全部的区域大小一样。组件按从左到右,从上到下的方法加入。
用构造函数划分出网格的行数和列数,
new GridLayout(行数,列数);
构造函数里的行数和列数可以有一个为零,可是不能都为零。当容器里添加控件时候,容器内将向0的那个方向增长。比如,假设是例如以下语句:
GridLayout layout= new GridLayout(0,1);
在添加控件时,会保持一个列的情况下,不断把行数增长。
java.awt.GridBagConstraints 中的insets(0,0,0,0)的參数详细指的是:
规定一个控件显示区的空白区。假设控件显示的inset为(10,5,20,0)
那么控件到显示区北边距离为10,西边为5,南边为20,东边为0控件会比显示区小。假设inset为负,控件会超出显示区
使容器中各个组件呈网格状布局,平均占领容器的空间.当全部组件大小同样时,使用此布局.其构造函数为:
GridLayout()
GridLayout(int row,int col)
GridLayout(int row,int col,int horz,int vert)
BoxLayout布局管理器: BoxLayout布局可以同意将控件依照X轴(从左到右)或者Y轴(从上到下)方向来摆放,并且沿着主轴可以设置不同尺寸。
构造BoxLayout对象时,有两个參数,比如:
Public BoxLayout(Container target,int axis);
Targe參数是表示当前管理的容器,axis是指哪个轴,有两个值??BoxLayout.X_AXIS和BoxLayout.Y_AXIS。
看例如以下的代码:
JPanel jpanel=new JPanel();
Jpanel.setLayout(new BoxLayout(jpanel,BoxLayout.Y_AXIS);
TextArea testArea=new TextArea(4,20);
JButton button=new JButton(“this is a button”);
jpanel.add(testArea);
jpanel.add(button);
//容纳testArea和button的容器,对他们沿Y轴(从上往下)放置,而且文本域和按纽左对齐。也就是两个控件的最左端在同一条线上
testArea.setAlignmentX(Component.LEFT_ALIGNMENT);
button. setAlignmentX(Component.LEFT_ALIGNMENT);
//容纳testArea和button的容器,对他们採用沿Y轴(从上往下)放置,而且文本域最左端和按纽的最右端在同一条线上
testArea.setAlignmentX(Component.LEFT_ALIGNMENT);
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 能够实现对齐。
GridBagLayout布局管理器:
这就是最复杂的一个布局管理器了,网格包布局.在此布局中,组件大小不必同样.
GridBagLayout gb=new GridBagLayout();
ContainerName.setLayout(gb);
以上代码是让容器获得一个GridBagLayout .
要使用网格包布局,还必须有其一个辅助类,GridBagContraints.它包括GridBagLayout类用来定位及调整组件大小所须要的所有信息.使用过程例如以下:
1).创建网格包布局的一个实例,并将其定义为当前容器的布局管理器.
2).创建GridBagContraints的一个实例
3).为组件设置约束.
4).通过方法统治布局管理器有关组件及其约束等信息
5).将组件加入到容器.
6).对各个将被显示的组件反复以上步骤..
GridBagContraints类的成员变量列表例如以下:
1).gridx,gridy
指定组件放在哪个单元中.其值应该设为常数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()方法能够设置各组件约束.
GridBagLayout是是在GridLayout的基础上发展起来的,是五种布局策略中使用最复杂,功能最强大的一种,它是在GridLayout的基础上发展起来的。由于GridBagLayout中每一个网格都同样大小并且强制组件与网格大小同样,使得容器中的每一个组件也都是同样的大小,显得非常不自然,并且组件假如容器中必须依照固定的行列顺序,不够灵活。在GridBagLayout中,能够为每一个组件指定其包括的网格个数,组件能够保留原来的大小,能够以随意顺序随意地增加容器的任何位置,从而实现真正自由地安排容器中每一个组件的大小和位置。
通过创建一个gridBagConstraints实例为组件设置布局參数:
gridx, gridy
gridwidth, gridheight
fill
ipadx, ipady
insets
anchor
CENTER (the default), NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, and NORTHWEST.
weightx, weighty
变量名 |
有效值 |
应用范围 |
定义 |
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 |
组件和显示区 |
内部填充 |