JAVA的GUI(图形用户界面)由各种组件构成,主要分为AWT组件(java.awt)以及功能更强的Swing组件(javax.swing)两种。
组件可以分为容器组件和非容器组件。容器组件是指可以包含其他组件的组件,又分为顶层容器和一般用途容器。非容器组件则必须包含在容器中。
组件的布局,包含各组件的位置和大小,通常由布局管理器负责。每个容器,都有一个默认的布局管理器,可以通过容器的setLayout()方法改变容器的布局管理器。
接下来介绍一下Java提供的几个常用的布局管理器。
1.FlowLayout
定义在java.awt包中。布局方式为:将组件逐个放置在容器中的一行上,一行放满就另起一个新行。
构造方式有3种:
FlowLayout():默认,居中对齐,水平和垂直间距是5个像素。
FlowLayout(int align):align指定对齐方式,水平和垂直间距是5个像素。align的可取的值有FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER。
FlowLayout(int align,int hgap,int vgap):align指定对齐方式,hgap指定水平间距,vgap指定垂直间距。
与其他布局管理器不同的是,FlowLayout不强行设定组件的大小,允许组件拥有自定义的尺寸。每个组件都有getPreferredSize()方法,容器的布局管理器会调用这一方法取得每个组件自定义的大小。
2.BorderLayout
定义在java.awt包中。是顶层容器(JFrame、JApplet、JDialog、JWindow)中内容窗格(Container contentPane,内容窗格获取方法getContentPane())的默认布局管理器。
提供了一种较为复杂的组件布局管理:将容器划分为5个区域,东(BorderLayout.NORTH)南(BorderLayout.SOUTH)西(BorderLayout.WEST)北(BorderLayout.EAST)中(BorderLayout.CENTER),每个区域可添加一组件。
构造方式有2种:
BorderLayout():默认,组件之间没有间距。
BorderLayout(int hgap,int vgap):指定水平间距(hgap),垂直间距(vgap)。
组件的添加:
组件必须通过add()方法加入到容器中的指定区域。默认放置在Center区域。
如果希望在某个区域显示多个组件,可以先在该区域放置一个内部容器,比如JPanel组件,然后将所需的多个组件放到JPanel中,再将其放到指定的区域。通过内部容器的嵌套可以构造复杂的布局。
3.GridLayout
定义在java.awt包中。布局为网格式,将容器划分成若干行乘若干列的网格,组件依次放入其中,每个组件占据一格。
构造方式有3种:
GridLayout():只有一行的网格,网格的列数根据实际需要变化。
GridLayout(int rows,int cols):指定行数(rows),列数(cols)。
GridLayout(int rows,int cols,int hgap, int vgap):指定行数(rows),列数(cols),指定水平间距(hgap),垂直间距(vgap)。
rows,cols可以为0(大小根据实际需要变动),但是不可同时为0。网格每列的宽度都是相同的,网格每行的高度也是相同的。组件被放入容器的次序决定位置,从左至右依次填充,一行用完后转入下一行。留白可以添加一个空白标签。
网格个数与组件个数的关系:多添少补(空白标签)。
容器大小改变,组件相对位置不变,大小随之改变。
4.CardLayout
定义在java.awt包中。布局为卡片式,将容器处理为一系列的卡片,每一时刻只显示其中的一张,容器充当卡片的容器。
显示规则为先进先显示。卡片的顺序由组件对象本身在容器内部的顺序决定。
构造方式有2种:
CardLayout():默认,无间距。
CardLayout(int hgap,int vgap):指定水平间距(hgap),指定垂直间距(vgap)。
常用方法:
add():容器添加组件。
public void first(Container parent):翻转到容器的第一张。
public void next(Container parent):翻转到容器的下一张。到底则翻首张。
public void previous(Container parent):翻转到容器的前一张。到头则翻末张。
public void last(Container parent):翻转到容器的最后一张。
public void show(Container parent, String name):翻转已添加的指定name卡片。不存在则没有反应。
5.BoxLayout
定义在javax.swing包中。布局方式为:将组件按水平方向排成一行,或者按垂直方向排成一列。
排成一行每个组件可以有不同的宽度;排成一列每个组件可以有不同的高度。
构造方法只有1种:
BoxLayout(Container target,int axis):容器对象参数target指定要应用布局的容器,axis设置按水平方向排列(BoxLayout.X_AXIS)或按垂直方向排列(BoxLayout.Y_AXIS)。
在javax.swing包中定义了专门使用BoxLayout的容器——Box类。
创建Box静态方法:
public static BoxcreateHorizontalBox():水平方向的BoxLayout。
public static BoxcreateVertitcalBox():垂直方向的BoxLayout。
创建Box不可见组件的方法:
作用是可以增加课件组件之间的距离。
public static Componet createHorizonalGlue()。
public static Componet createVerticalGlue()。
public static Componet createHorizonalStrut(int width)。
public static Componet createVerticalStrut(int height)。
public static Componet createRigidArea(Dimension d)。
6.空布局
特殊场合可以不适用布局管理器。
调用容器的setLayout(null)将布局管理器设置为空,然后调用组件的setBounds(int x, int y, int width, int height)设置组件大小位置。