1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,2.3 使用布局管理器,主讲教师:董婷,一、,知识能力目标,1.理解容器的概念及层次;,2.掌握常用布局管理器的使用;,3.运用布局管理器设计布局美观的GUI程序,二、项目14 电子日历,显示2008年的电子日历,1.程序代码,import java.util.Calendar;,import java.util.*;,import java.awt.*;,import java.awt.event.*;,import java.applet.*;,public class CalendarMain
2、Class,public static void main(String args),CalendarFrame frame=new CalendarFrame();,frame.setBounds(100,100,360,300);/设置窗体位置大小,frame.setVisible(true);/设置窗体可见,frame.validate();,frame.addWindowListener(new WindowAdapter(),public void windowClosing(WindowEvent e),System.exit(0);,);,class CalendarBean/创
3、建用于判断年月日之间关系的类CalendarBean,String day;,int year=2008,month=0;,public void setYear(int year)/设置年份的方法,this.year=year;,public int getYear()/获得年份的方法,return year;,public void setMonth(int month)/设置月份的方法,this.month=month;,public int getMonth()/获得月份的方法,return month;,public String getCalendar(),String a=new
4、 String42;,Calendar 日历=Calendar.getInstance();,日历.set(year,month-1,1);,int 星期几=日历.get(Calendar.DAY_OF_WEEK)-1;,int day=0;,if(month=1|month=3|month=5|month=7|month=8|month=10|month=12),day=31;,if(month=4|month=6|month=9|month=11),day=30;,if(month=2)/判断月份是否为2月,if(year%4=0)&(year%100!=0)|(year%400=0)/判
5、断是否为闰年,day=29;,nextMonth=new Button(下月);,previousMonth=new Button(上月);,nextMonth.addActionListener(this);,previousMonth.addActionListener(this);,Panel pNorth=new Panel(),pSouth=new Panel();,pNorth.add(previousMonth);,pNorth.add(nextMonth);,pSouth.add(showMessage);,showMessage.setText(当前是:+calendar.g
6、etYear()+年+calendar.getMonth()+月);,ScrollPane scrollPane=new ScrollPane();,scrollPane.add(pCenter);,add(scrollPane,BorderLayout.CENTER);/在窗口中心区域添加scrollPane,add(pNorth,BorderLayout.NORTH);/在窗口北面区域添加pNorth,add(pSouth,BorderLayout.SOUTH);/在窗口南面区域添加pSouth,public void actionPerformed(ActionEvent e),if(e
7、getSource()=nextMonth)/单击下月按钮时刷新日期,month=month+1;,if(month12),month=1;,calendar.setMonth(month);,String day=calendar.getCalendar();,for(int i=0;i42;i+),labelDayi.setText(dayi);,else if(e.getSource()=previousMonth)/单击上月按钮时刷新日期,month=month-1;,if(month1),month=12;,calendar.setMonth(month);,String day=
8、calendar.getCalendar();,for(int i=0;i42;i+),labelDayi.setText(dayi);,showMessage.setText(当前是:+calendar.getYear()+年+calendar.getMonth()+月);,2.相关知识,流布局(FlowLayout),呈水平放置,直到同一条线上再也没有适合的控件,对齐方式由 align 属性确定。可能的值为:,LEFT,RIGHT,CENTER,LEADING,TRAILING,方法,主要功能,FowLayout(),生成一个默认的流式布局,FlowLayout(int alignment
9、),可以设定每一行组件的对齐方式,FlowLayout(int alignment,int horz,int vert),可以设定对齐方式以及通过参数horz和vert分别设定组件的水平和垂直间距,void,addLayoutComponent(Stringname,Componentcomp),将指定的组件添加到布局中,void setAlignment(intalign),设置此布局的对齐方式,void setHgap(inthgap),设置组件之间以及组件与,Container,的边之间的水平间隙,void setVgap(intvgap),设置组件之间以及组件与,Container,的
10、边之间的垂直间隙,int getAlignment(),获取此布局的对齐方式,int getHgap(),获取组件之间以及组件与,Container,的边之间的水平间隙,int getVgap(),获取组件之间以及组件与,Container,的边之间的垂直间隙,边界布局(BorderLayout),对容器组件进行安排,并调整其大小,使其符合下列五个区域:南、北、东、西和中间区域,方法,主要功能,BorderLayout(),构造一个组件之间没有间距的新边框布局,BorderLayout,(inthgap,intvgap),构造一个具有指定组件间距的边框布局,void,addLayoutComp
11、onent(Componentcomp,Objectconstraints),使用指定的约束对象将指定组件添加到布局中,void setHgap(inthgap),设置组件之间的水平间隙,void setVgap(intvgap),设置组件之间的垂直间隙,int getHgap(),获取组件之间的水平间隙,int getVgap(),获取组件之间的垂直间隙,网格布局(GridLayout)以矩形网格形式对容器的组件进行布置,容器被分成大小相等的矩形,一个矩形中放置一个组件,方法,主要功能,GridLayout(),生成一个单列的网格布局。默认无间隙。,GridLayout(int row,in
12、t col),生成一个设定行数和列数的网格布局,GridLayout(int row,int col,int horz,int vert),可以设置组件之间的水平和垂直间隔,void addLayoutComponent(Stringname,Componentcomp),将具有指定名称的指定组件添加到布局,void setColumns(intcols),将此布局中的列数设置为指定值,void setRows(introws),将此布局中的行数设置为指定值,int getColumns(),获取此布局中的列数,int getRows(),获取此布局中的行数,卡片布局(CardLayout)将
13、容器中的每个组件看作一张卡片,方法,主要功能,CardLayout(),创建一个间距大小为 0 的新卡片布局,CardLayout(inthgap,intvgap),创建一个具有指定水平间距和垂直间距的新卡片布局,void,addLayoutComponent(Componentcomp,Objectconstraints),将指定的组件添加到此卡片布局的内部名称表,void next(Container parent),翻转到指定容器的下一张卡片,void previous(Container parent),翻转到指定容器的前一张卡片,void first(Container parent
14、),翻转到容器的第一张卡片,void last(Container parent),翻转到容器的最后一张卡片,void show(Container parent,String name),翻转到使用,addLayoutComponent,添加到此布局的具有指定,name,的组件,三、项目15 使用网格袋布局,使用网格袋布局管理器,将窗体中的控件进行如图布局设计,1.程序代码,import java.awt.*;,import java.awt.event.*;,import javax.swing.*;,class GBC extends GridBagConstraints,private
15、 static final long serialVersionUID=6657272964185905015L;,/设置网格座标参数,public GBC(int x,int y),this.gridx=x;,this.gridy=y;,/设置网格座标和占的网格数,public GBC(int gridx,int gridy,int gridwidth,int gridheight),this.gridx=gridx;,this.gridy=gridy;,this.gridwidth=gridwidth;,this.gridheight=gridheight;,public GBC setA
16、nchor(int anchor),this.anchor=anchor;,return this;,public GBC setFill(int fill),this.fill=fill;,return this;,/设置单元网格大小,public GBC setWeight(double weightx,double weighty),this.weightx=weightx;,this.weighty=weighty;,return this;,/设置网格之间的相互距离,public GBC setInset(int distance),this.insets=new Insets(di
17、stance,distance,distance,distance);,return this;,/设置网格之间的相互距离,public GBC setInset(int top,int left,int bottom,int right),this.insets=new Insets(top,left,bottom,right);,return this;,/设置网格的初始位置,public GBC setIpad(int ipadx,int ipady),this.ipadx=ipadx;,this.ipady=ipady;,return this;,public class GridBa
18、gLayoutTest extends JFrame,/*序列化序号,private static final long serialVersionUID=6763277356654198370L;,public GridBagLayoutTest(),this.setTitle(“GridBagLayoutTest”);/窗体标题,this.setSize(400,150);/窗体大小,/设置窗体居中显示在屏幕上,Dimension size=Toolkit.getDefaultToolkit().getScreenSize();,this.setLocation(int)(size.get
19、Width()-this.getWidth()/2,(int)(size.getHeight()-this.getHeight()/2);,/初始化窗口面板,this.initial();,/设置窗体为不可改变大小,this.setResizable(false);,/设置窗体为显示,this.setVisible(true);,/初始化窗体上的面板,public void initial(),JPanel panel=new JPanel();,panel.setLayout(new GridBagLayout();,/设置所有控件所占网格的大小,位置,座标,对齐方式,panel.add(n
20、ew JScrollPane(new JTextArea(),new GBC(0,0,2,3),.setWeight(10,0).setFill(GBC.BOTH);,panel.add(new JButton(按钮一),new GBC(2,0,2,1).setWeight(5,0),.setFill(GBC.BOTH);,panel.add(new JButton(按钮二),new GBC(2,1).setWeight(5,0).setFill(,GBC.BOTH);,panel.add(new JButton(按钮三),new GBC(3,1).setWeight(5,0).setFill
21、GBC.BOTH);,panel.add(new JComboBox(new String 组合框),new GBC(2,2,2,1),.setWeight(5,0).setFill(GBC.BOTH);,panel.add(new JTextField(单行文本框),new GBC(0,3,4,1).setWeight(5,0).setFill(GBC.BOTH);,this.setLayout(new BorderLayout();,this.getContentPane().add(panel,BorderLayout.CENTER);,public static void main
22、String args),/匿名内部类,为窗口注册事件,new GridBagLayoutTest().addWindowListener(new WindowAdapter(),public void windowClosing(WindowEvent e),System.exit(0);,);,2.相关知识GridBagLayout,类,方法,GridBagLayout(),void setConstraints,(Componentcomp,GridBagConstraintsconstraints),主要功能,创建网格袋布局管理器,设置此布局中指定组件的约束条件,GridBagCon
23、straints,类,方法,主要功能,GridBagConstraints(),创建一个,GridBagConstraint,对象,将其所有字段都设置为默认值,GridBagConstraints(intgridx,intgridy,intgridwidth,intgridheight,doubleweightx,doubleweighty,intanchor,intfill,Insetsinsets,intipadx,intipady),创建一个,GridBagConstraints,对象,将其所有字段都设置为传入参数,成员变量,含义,static int RELATIVE,指定此组件为其行
24、或列中的倒数第二个组件,或者让此组件紧跟在以前添加的组件之后,static int,REMAINDER,指定此组件是其行或列中的最后一个组件,int fill,当组件的显示区域大于它所请求的显示区域的大小时使用此字段,int gridheight,指定在组件显示区域的一列中的单元格数,int gridwidth,指定组件显示区域的某一行中的单元格数,int gridx,指定包含组件的显示区域开始边的单元格,其中行的第一个单元格为,gridx=0,int gridy,指定位于组件显示区域的顶部的单元格,其中最上边的单元格为,gridy=0,成员变量,含义,int anchor,当组件小于其显示区
25、域时使用此字段。它可以确定在显示区域中放置组件的位置,double weightx,指定如何分布额外的水平空间,double weighty,指定如何分布额外的垂直空间。,Insets insets,指定组件的外部填充,即组件与其显示区域边缘之间间距的最小量。,int ipadx,指定组件的内部填充,即给组件的最小宽度添加多大的空间。,int,ipady,指定组件的内部填充,即给组件的最小高度添加多大的空间。,fill,NONE:不调整组件大小。,HORIZONTAL:加宽组件,使它在水平方向上得以填满其显示区域,但是不改变高度。,VERTICAL:加高组件,使它在垂直方向上得以填满其显示区域
26、但是不改变宽度。,BOTH:使组件完全填满其显示区域,anchor,可能的值有两种:相对和绝对,相对值的解释是相对于容器的组件方向属性,PAGE_START、PAGE_END、LINE_START、LINE_END、FIRST_LINE_START、FIRST_LINE_END、LAST_LINE_START 和 LAST_LINE_END。,绝对值则不然,CENTER、NORTH、NORTHEAST、EAST、SOUTHEAST、SOUTH、SOUTHWEST、WEST 和 NORTHWEST,默认值为 CENTER,Insets 对象是容器边界的表示形式,它指定容器必须在其各个边缘留出的
27、空间。,这个空间可以是边界、空白空间或标题。,Insets,(inttop,intleft,intbottom,intright)创建并初始化具有指定顶部、左边、底部、右边 inset 的新 Insets 对象。,默认值为 new Insets(0,0,0,0)。,GridBagLayout,不要求组件的大小相同即可将组件垂直和水平对齐,每个 GridBagLayout 对象维持一个动态的矩形单元网格,每个组件占用一个或多个这样的单元,称为,显示区域,。,每个由 GridBagLayout 管理的组件都与,GridBagConstraints,的实例相关联,Constraints 对象指定组件
28、在网格中的显示区域以及组件在其显示区域中的放置方式,网格的总体方向取决于容器的,ComponentOrientation,属性,对于水平的从左到右的方向,网格坐标(0,0)位于容器的左上角,其中 X 向右递增,Y 向下递增,对于水平的从右到左的方向,网格坐标(0,0)位于容器的右上角,其中 X 向左递增,Y 向下递增。,为了有效使用网格包布局,必须自定义与组件相关联的一个或多个 GridBagConstraints 对象,可以通过设置一个或多个实例变量来自定义 GridBagConstraints,【应用拓展】,Java允许用手工布局(null)放置各个组件,需要自己设置组件的位置和大小,步骤:,取消容器的默认管理器:setLayout(null),设置位置和大小,setLocation()、setSize()、setBounds()等,






