1、单元单元 14Swing 布局管理布局管理单元目标 掌握 Java 布局管理方式和布局管理器 掌握常见布局方式的特点和使用方法学习任务1.任务描述编写一个类似于 Windows 自带的计算器程序。可以实现加减乘除等基本数学运算。本次任务只完成界面的设计和显示任务,用户操作响应和计算功能在下次任务中完成。2.运行结果知识准备14.1 Java 布局管理在实际编程中,我们每设计一个窗体,都要往其中添加若干组件。为了管理好这些组件的布局,即大小、位置和排列方式,我们就需要使用布局管理器。将加入到容器的组件按照一定的顺序和规则放置, 使之看起来更美观, 这就是布局。计算器界面设计计算器界面设计在 Ja
2、va 中,布局由布局管理器 (LayoutManager) 来管理。Java 提供了一组用来 进 行布局管理的类,称为布局管理器 或布局。所有布局都实现了LayoutManager 接口。容器内组件的大小和位置由布局管理器控制,当容器大小发生改变时,可以自动调整,以尽量美观的方式适应容器的变化。14.2 常见的布局管理器常 见 的 布 局 管 理 器 包 括FlowLayout 、 CardLayout 、 GridLayout 、BorderLayout、BoxLayout 、GridBagLayout 等。如果不使用布局管理器,叫做空布局或 Null 布局,容器内组件的大小和位置用绝对值指
3、定,当容器大小发生改变时,不会改变。14.2.1 网格布局网格布局是一种常用的布局方式,将容器的区域划分成矩形网格,每个矩形大小规格一致,组件可以放置在其中的一个矩形中。通过 java.awt.GridLayout类创建网格布局管理器对象,实现对容器中的各组件的网格布局排列。具体的排列方向取决于容器的组件方向属性, 组件方向属性有两种: 从左向右和从右向左。用户可以根据实际要求进行设定方向属性,默认的方向是从右向左。1.创建网格布局GridLayout 的构造方法如下: GridLayout():创建默认的网格布局。每一个组件占据一行一列。 GridLayout(int rows,int co
4、lumns):创建指定行数和列数的网格布局。 GridLayout(int rows,int columns, int hgap,int vgap):创建指定行数和列数的网格布局,并且指定水平间隔和垂直间隔的大小。2.GridLayout 的常见方法GridLayout 的常见方法见表 4-1。表 4-1 GridLayout 的主要方法方方法法功功能能int getRows()获取行数void setRows(int)设置行数int getColumns()获取列数void setColumns(int)设置列数int getHgap()获取组件水平间隔void setHgap(int)设置
5、组件水平间隔int getVgap()获取组件垂直间隔void setVgap()设置组件垂直间隔例如,下面一段代码可实现如图 4-8 所示的运行效果:String str=1,2,3,4,5,6,7,8,9;setLayout(new GridLayout(3,3);Button btn=new Buttonstr.length; / 创建按钮数组for(int i=0;istr.length;i+)btni=new Button(stri);add(btni);图 4-8 网格布局14.2.2 边界布局边界布局 BorderLayout 是窗口、框架和对话框等的缺省布局。组件可被置于容器的
6、北(上) 、南(下) 、东(右) 、西(左)或中间位置。它可以对容器组件进行安排,并调整其大小,使其符合上述五个区域,每个区域最多只能包含一个组件,并通过相应的常量进行标识:NORTH、SOUTH、EAST、WEST 和CENTER。当使用边界布局将一个组件添加到容器中时,要使用这五个常量之一。 NORTH 和 SOUTH 组件可以在水平方向上进行拉伸; 而 EAST 和 WEST组件可以在垂直方向上进行拉伸;CENTER 组件在水平和垂直方向上都可以进行拉伸,从而填充所有剩余空间。1.创建边界布局下面是 BorderLayout 所定义的构造函数:BorderLayout( ):生成默认的边
7、界布局BorderLayout(int horz,int vert): 可以设定组件间的水平和垂直距离BorderLayout 类定义了几个常量值以指定相应区域:BorderLayout.NORTH 对应容器的顶部BorderLayout.EAST 对应容器的右部BorderLayout.SOUTH 对应容器的底部BorderLayout.WEST 对应容器的左部BorderLayout.CENTER 对应容器的中部加入组件方法是 void add(Component Obj, int region)。下面代码段可实现如图 4-9 所示的运行效果。setLayout(new BorderLay
8、out();Button btnEast=new Button(东);Button btnWest=new Button(西);Button btnNorth=new Button(北);Button btnSouth=new Button(南);Button btnCenter=new Button(中);add(btnEast,BorderLayout.EAST);add(btnWest,BorderLayout.WEST);add(btnNorth,BorderLayout.NORTH);add(btnSouth,BorderLayout.SOUTH);add(btnCenter,Bor
9、derLayout.CENTER);图 4-9 边界布局当窗口缩放时,组件的位置不发生变化,但组件的大小会相应改变。边界布局管理器给予南、北组件最佳高度,使它们与容器一样宽;给予东、西组件最佳宽度,而高度受到限制。如果窗口水平缩放,南、北、中区域变化;如果窗口垂直缩放, 东、 西、 中区域变化。 BorderLayout 是窗口( JWindow)、 框架(JFrame)、对话框(JDialog)等类型对象的默认布局。2.BorderLayout 的常用方法BorderLayout 的常用方法见表 4-2 。表 4-2 BorderLayout 的主要方法方方法法功功能能voidaddLayo
10、utComponent(Component,Object)按指定约束添加组件到布局计算器界面设计int getHgap()获取组件水平间隔void setHgap(int)设置组件水平间隔int getVgap()获取组件垂直间隔void setVgap()设置组件垂直间隔14.2.3 流布局类 FlowLayout 是流布局管理器。这种管理器的特点是,组件在容器内依照指定方向按照组件添加的顺序依次加入到容器中。这个指定方向取决于FlowLayout 管理器的组件方向属性。该属性有两种可能:从左到右方向和从右向左方向。在默认情况下,这个指定方向是从左到右的。1.创建流布局下面是流布局 Bord
11、erLayout 所定义的构造函数:FlowLayout():创建一个流布局管理器,居中对齐,默认的水平和垂直间隙是 5 个单位。FlowLayout(int align):创建一个指定对齐方式的流布局管理器,默认的水平和垂直间隙是 5 个单位。具体的对齐方式有居中对齐、 左向对齐、 右向对齐、容器开始的方向对齐(LEADING)以及容器结束的方向对齐(TRAILING) 。FlowLayout(int align, int hgap, int vgap):创建一个流布局管理器,具有指定的对齐方式以及指定的水平和垂直间隙。2.FlowLayout 的常用方法FlowLayout 的常用方法见表
12、 4-3。表 4-3 FlowLayout 的主要方法方方法法功功能能int getAlignment()获取对齐方式void setAlignment(int)设置对齐方式void setHgap(int)设置组件水平间隔void setVgap()设置组件垂直间隔14.2.4 卡片布局卡片布局管理器能将容器中的组件看成不同的卡片层叠排列, 每次只能显示一张卡片。每张卡片只能容纳一个组件。初次显示时,显示的是第一张卡片。卡片布局管理器是通过 AWT 包的类 CardLayout 来创建的。1.创建卡片布局CardLayout 的构造方法如下:CardLayout():创建一个间隔为 0 的卡
13、片布局。CardLayout(int hgap,int vgap):创建一个指定水平间隔和垂直间隔的卡片布局。2. CardLayout 的常用方法CardLayout 的常用方法见表 4-4。表 4-4 CardLayout 的主要方法方方法法功功能能void first(Container)翻转第一张卡片void next(Container)翻转下一张卡片void previous(Container)翻转上一张卡片void last(Container)翻转最后一张卡片void show(Container,String)翻转指定名称的卡片任务实施1实现思路计算器界面整体布局采用 Bo
14、rderLayout。在上部安放一个 JTextField 对象,作为结果显示区。中部和右部各安放一个 JPanel 对象,作为嵌套用的容器。中部 keyPanel 对象采用 GridLayout,设置为 5 行 3 列,每个单元格可以显示一个按钮,用于显示数字键盘、小数点等按钮。右部 operatorPanel 对象采用GridLayout,设置为 4 行 1 列,显示加、减、乘、除四个按钮。(1)建立 Calculator 类指定超类 JFrame(2)设置窗口布局为 BorderLayout(3)在上部添加 JTextField 对象 result(4)在中部添加 keyPanel 及其
15、上面的按钮(5)在右部添加 operatorPanel 及其上面的按钮(6)书写 main 方法测试2. 程序代码JButton jb;JPanel jp = new JPanel();jp.setLayout(new BorderLayout();/ 创建文本条,不允许编辑,添加到窗口上方result = new JTextField();result.setEditable(false);jp.add(result,BorderLayout.NORTH);计算器界面设计JPanel keyPanel = new JPanel();keyPanel.setLayout(new GridLay
16、out(5,3);for(int i=1;i=9;i+)jb = new JButton(+i);keyPanel.add(jb);jb = new JButton(0);keyPanel.add(jb);jb = new JButton(清空);keyPanel.add(jb);jb = new JButton(退格);keyPanel.add(jb);jb = new JButton(.);keyPanel.add(jb);jb = new JButton(=);keyPanel.add(jb);jp.add(keyPanel,BorderLayout.CENTER);JPanel ope
17、ratorPanel = new JPanel();operatorPanel.setLayout(new GridLayout(4,1);jb = new JButton(+);operatorPanel.add(jb);jb = new JButton(-);operatorPanel.add(jb);jb = new JButton(*);operatorPanel.add(jb);jb = new JButton(/);operatorPanel.add(jb);jp.add(operatorPanel,BorderLayout.EAST);/添加 JPanel 容器到窗体中setCo
18、ntentPane(jp);任务拓展1. GridBagLayoutGridBagLayout 中组件大小不必相同,组件按行和列排列,放置顺序不一定为从左至右和由上至下,显示效果如图 4-10 所示。通过使用以下语法,容器可获得 GridBagLayout 布局对象: GridBagLayout gb=new GridBagLayout(); ContainerName.setLayout(gb);要使用此布局,必须提供各组件的大小和布局等信息。GridBagConstraints类中包含 GridBagLayout 类用来定位及调整组件大小所需的全部信息。图 4-10 GridBagLayo
19、ut 布局GridBagConstraints 类成员变量列表: gridx, gridy : 指定组件放置于哪个单元中;gridwidth, gridheight 指定组件将占用多少行和多少列;weightx, weighty指定在一个 GridBagLayout 中应如何分配空间,这些变量的缺省值为 0(组件挤在容器中间,1 则填满容器)ipadx, ipady 指定组件的最小高度和宽度;fill 指定在单元大于组件的情况下,组件如何填充此单元,共有 4 可选值。缺省值为:GridBagConstraints.NONE(HORIZONTAL、VERTICAL、BOTH) ;anchor 指
20、定 将 组 件 放 置 在 单 元 中 的 位 置 , 共 有 9 个 可 选 值 。 缺 省 值 为 :GridBagConstraints.CENTER。Box 布局中组件排为一行或一列,组件再多也不会变为多行或多列,可使用支撑调整组件间距离,可使用胶水处理剩余空间。组件间隙有时可以通过直接设定实现,例如网格布局和边界布局,组件水平和垂直间距缺省值为 0,但可以通过相应的构造方法设定空隙: GridLayout(int rows,int cols,int hgap,int vgap); Borderlayout(int hgap,int vgap);hgap 和 vgap 分别为组件间水平
21、和垂直方向的空白空间。另外,在布局时还可以使用空隙类。空隙类的对象是一种占用空间但却透明不可见的组件,用于控制组件之间的间隔,使组件之间可以更好地显示。空隙类的创建方法如下: Componentcomponent=Box.createRigidArea(size):方形空隙类。 Componentcomponent=Box.createHorizontaIGlue(size):水平空隙类。 Componentcomponent= Box.createHorizontaIStrut( size):水平空隙类,可以定义长度。 Componentcomponent=Box.createVertica
22、lGlue(size):垂直空隙类。 Componentcomponent=Box.createVerticaIStrut(size):垂直空隙类,可以定义高度。2.自定义布局自定义布局也被称为“空布局”或“Null 布局” 。调用方法 setLayout(null)就为容器设置了空布局。在空布局中,可以通过调用组件的 setBounds(int x,inty,int width,int height)方法指定组件的位置和大小。容器大小改变时,空布局中的组件位置和大小均不发生改变。上面介绍了几种常见的布局管理器,每个布局管理器都有自己特定的用途。要按行和列显示几个同样大小的组件,GridLay
23、out 会比较合适;要在尽可能大的空间里显示一个组件,就要选择 BorderLayout 或 GridBagLayout。每个容器(Container 对象)都有一个与它相关的缺省的布局管理器。JFrame 的缺省布局是 BorderLayout,在没有设置新的布局前,在容器中添加组件都按照该容器的缺省布局排列。可以通过 setLayout()方法为容器设置新的布局。布局器不只是上面所讲的几种类型,常见的还有JRootPane.RootLayout,OverlayLayout,SpringLayout,OverlayLayout,ScrollPaneLayout 等,更多的布局器可以通过 JDK 文档,查看 LayoutManager和 LayoutManager2 两个接口。 我们也可以通过实现上面两个接口来定义我们自己的特殊的布局方式任务实训1.实训目的 了解 Java 布局管理的各种方法; 掌握 FlowLayout 布局管理的使用; 掌握 BorderLayout 布局管理的使用; 掌握 GridLayout 布局管理的使用; 掌握自定义布局管理的使用。2.实训内容计算器界面设计利用 Java Swing 技术设计一个 Email 注册页面,要求不管是否调整窗口大小,最终的运行界面效果一致。运行结果如图 4-2-1 所示。图 4-2-1 Email 注册