1、第5章 图形用户界面设计v教学目标:v通过本章的学习,掌握常用容器组件的用法、容器组件的布局方式、组成界面的可视组件的功能与用法;掌握事件处理机制,能进行菜单设计,最终达到开发出智能化的图形界面应用程序的目的。v案例 学生信息注册界面设计解析v多数学校的学生档案信息都由计算机进行管理,在编写的档案管理应用程序中,有档案信息录入模块,该模块的功能是在图形化的界面下,用户把信息输入到计算机中。录入界面的大致样式及组件名称如图 v设计上述程序界面并实现相应的功能,程序框架如下:vpublic class InputData implements ActionListenervvFrame f;/声明
2、框架对象vLabel l1,l2,l3,l4;/声明标签对象vTextField t;/声明文本行对象vCheckbox r1,r2;/声明单选按钮对象vCheckboxGroup g;/声明组对象vCheckbox c1,c2,c3;vChoice ch;/声明选择框对象vButton b;/声明按钮对象vTextArea ta;/声明文本区对象vPanel p1,p2,p3,p4,p5;/声明面板对象vint i=0;vvpublic InputData()vv对象实例化;vch.add(济南);/添加选择项vp1=new Panel();vp1.setLayout(new FlowLay
3、out(FlowLayout.LEFT);/设定面板布局样式vp1.add(l1);/在面板中加入组件vf.setLayout(new GridLayout(2,1);/设定框架布局样式vf.addWindowListener(new WindowAdapter()/注册事件监听器,匿名类实现接口vpublic void windowClosing(WindowEvent e)vSystem.exit(0););vf.setVisible(true);vvvpublic void actionPerformed(ActionEvent e)/事件处理接口实现v v /把输入内容显示到文本区中;
4、vvpublic static void main(String args)vvnew InputData();vvv在上面的案例框架中,应用到了如下知识点。v(1)组成界面的各种组件。v(2)界面的布局样式。v(3)事件处理机制。v下面将详细介绍相关的知识。5.1 框架与面板 v5.1.1 认识Component类 v部分类的继承关系如图 vComponent类是其他组件类的父类,在此介绍该类的一些方法,这些方法可直接继承到子类中使用。v(1)setFont(Font f):设置组件的字体。v(2)setForeground(Color r):设置组件的前景色。v(3)setLocation
5、(int x,int y):设置组件的显示位置。v(4)setSize(int width,int height):调整组件的大小,使其宽度为 width,高度为 height。v(5)setVisible(boolean b):根据参数 b 的值显示或隐藏此组件。v(6)getForeground():获得组件的前景色。v(7)getFont():获得组件的字体。v(8)getBackground():获得组件的背景色。v(9)getHeight():返回组件的当前高度。v(10)invalidate():使此组件无效。v(11)getBounds():以Rectangle 对象的形式获得组
6、件的边界。v5.1.2 框架v框架类Frame是一种带标题条并且可以改变大小的窗口,该类为容器类。Frame类的构造方法及实例方法:类别方 法 定 义功 能构造方法public Frame()创建一个不带标题信息的框架public Frame(String title)创建一个标题信息是title的框架实例方法public void add(Component comp)在框架中添加组件comppublic void setLayout(LayoutManager mgr)设置布局方式public void setTitle(String title)设置框架的标题public String
7、getTitle(String title)获取框架的标题v5.1.3 面板v面板类Panel也是容器类。但与Frame类的区别是,面板是一种没有标题条的容器,在应用时只能把该类实例化的对象通过Container类的add方法加载到Window对象中。v该类的构造方法如下。v(1)public Panel():创建一个面板对象。v(2)public Panel(LayoutManager mgr):创建一个面板对象且约定了添加到该面板中组件的布局样式。5.2 布局管理器v5.2.1 边界布局v该布局将容器组件划分成了5个区域:南(South)、北(North)、东(East)、西(West)、
8、中(Center)。v边界布局类边界布局类v边界布局类为BorderLayout,该类的构造方法如下。v(1)public BorderLayout():创建一个边界布局管理类对象。v(2)public BorderLayout(int hgap,int vgap):创建一个边界布局管理类对象。其中,hgap和vgap指定组件的水平和垂直间距,单位是像素,默认值为0。v若向容器中加入组件,可以通过以下两种形式实现。v(1)add(String s,Component comp):其中s代表位置,位置用字符串“South”、“North”、“East”、“West”、“Center”表示。v(2
9、)add(Component comp,int x):其中x是代表位置的常量值,分别是BorderLayout.SOUTH、BorderLayout.NORTH、BorderLayout.EAST、BorderLayout.WEST、BorderLayout.CENTER。v说明:(1)在边界布局中,若向框架加入组件,如果不指定位置,则默认把组件加到了“中”的区域。v(2)若某个位置未被使用,则该位置将被其他组件占用。v5.2.2 流布局v该布局按从左至右、从上至下的方式将组件加入到容器中。v流布局类流布局类v流布局类为FlowLayout,该类的构造方法如下。v(1)public FlowL
10、ayout():创建一个流布局类对象。(2)public FlowLayout(int align):创建一个流布局类对象,其中align表示对齐方式,其值有3个,为FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER,默认为FlowLayout.CENTER。v(3)public FlowLayout(int align,int hgap,int vgap):其中align表示对齐方式;hgap和vgap指定组件的水平和垂直间距,单位是像素,默认值为5。v5.2.3 网格布局v该布局将容器划分成规则的行列网格样式,组件逐行加入到网格中,每个组件
11、大小一致。但当容器中放置的组件数超过网格数时,则自动增加网格列数,行数不变。v1网格布局类v网格布局类为GridLayout,该类的构造方法如下。v(1)public GridLayout(int rows,int cols):rows表示网格行数,cols表示网格列数。v(2)public GridLayout(int rows,int cols,int hgap,int vgap):rows表示网格行数,cols表示网格列数;hgap和vgap指定组件的水平和垂直间距,单位是像素。v5.2.4 卡片布局v使用该布局样式布局容器中的组件时,组件就会像卡片一样排放在容器中,只有最上面的卡片可见
12、。类别类别方方 法法 定定 义义功功 能能构造构造方法方法public CardLayout()创建一个卡片对象创建一个卡片对象实例实例方法方法public void add(String name,Component c)添加组件添加组件c,并指定组件的名称,并指定组件的名称为为namepublic void first(Container parent)显示第一张卡片显示第一张卡片public void last(Container parent)显示最后一张卡片显示最后一张卡片public void next(Container parent)显示下一张卡片显示下一张卡片public v
13、oid previous(Container parent)显示前一张卡片显示前一张卡片public void show(Container parent,String name)显示指定名称的卡片显示指定名称的卡片5.3 按钮、标签、文本行、文本区 v5.3.1 按钮(Button)v图形用户界面中,按钮常用于接收用户的单击事件。v1.构造方法v(1)public Button():通过该构造方法创建按钮时,按钮上没有说明信息。v(2)public Button(String s):通过该构造方法创建按钮时,按钮上的说明信息为s。v2.常用方法v(1)public void setLabel
14、(String s):通过该方法,把按钮上的说明信息设为s。v(2)public String getLabel():通过该方法,获取按钮上的说明信息。v5.3.2 标签(Label)v标签的功能是显示静态文本,不能动态地编辑文本,作为提示信息通常由标签实现。v1构造方法v(1)public Label():通过该构造方法创建标签时,标签没有提示信息。v(2)public Label(String s):通过该构造方法创建标签时,标签上显示的提示信息为s。v(3)public Label(String s,int align):通过该构造方法创建标签时,标签上的提示信息为s,并设定了标签文本的
15、对齐方式,分别为Label.LEFT(左对齐)、Label.RIGHT(右对齐)、Label.CENTER(居中对齐),默认对齐方式为居中对齐。v2常用方法v(1)public void setText(String s):通过该方法,把标签上的提示信息设为s。v(2)public String getLabel():通过该方法,获取标签上的提示信息。v5.3.3 文本行(TextField)v文本行用来输入单行文本。类别类别方方 法法 定定 义义功功 能能构造构造方法方法public TextField()创建一个内容为空的文本行创建一个内容为空的文本行public TextField(St
16、ring s)创建一个内容为创建一个内容为s的文本行的文本行public TextField(int x)创建一个能显示创建一个能显示x个字符的文本行个字符的文本行public TextField(String s,int x)创建一个内容为创建一个内容为s的文本行,且文本行长度的文本行,且文本行长度为为x实例实例方法方法public void setText(String s)设置文本行中的内容为设置文本行中的内容为spublic String getText()获取文本行中的内容获取文本行中的内容public void setEchoChar(char c)设置文本行的回显字符。常用于口令
17、输入设置文本行的回显字符。常用于口令输入public void setEditable(boolean b)设置文本的可编辑性。当参数值为设置文本的可编辑性。当参数值为false时,时,只能只能显示,不能修改显示,不能修改v5.3.4 文本区(TextArea)v文本区可以输入多行文本,且文本区带有滚动条。类别类别方方 法法 定定 义义功功 能能构造构造方法方法public TextArea()创建一个内容为空的文本区对象创建一个内容为空的文本区对象public TextArea(String s)创建一个内容为创建一个内容为s的文本区对象的文本区对象public TextArea(int x
18、,int y)创建一个内容为空且行数为创建一个内容为空且行数为x、列数为、列数为y的文本的文本区对象区对象public TextArea(String s,int x,int y)创建一个内容为创建一个内容为s且行数为且行数为x、列数为、列数为y的文本区的文本区对象对象public TextArea(String s,int x,int y,int scollbar)创建一个内容为创建一个内容为s、行数为、行数为x、列数为、列数为y、滚、滚动条样式为指定样式的文本区对象。动条样式为指定样式的文本区对象。scollbar取值为:取值为:TextArea.SCOLLBARS_BOTH,TextAr
19、ea.SCOLLBARS_VERTICAL_ONLY,TextArea.SCOLLBARS_HORIZONTAL_ONLY,TextArea.SCOLLBARS_NONE实例实例方法方法public void append(String s)在文本区尾部追加文本内容在文本区尾部追加文本内容s实实例例方方法法public void insert(String s,int position)在文本区位置在文本区位置position处插入文本处插入文本spublic void setText(String s)设置文本区中的内容为文本设置文本区中的内容为文本spublic String getTex
20、t()获取文本区的内容获取文本区的内容public String getSelectedText()获取文本区中选中的内容获取文本区中选中的内容public void replaceRange(String s,int start,int end)把文本区中从把文本区中从start位置开始至位置开始至end位置之间的文本位置之间的文本用用s替换替换public void setCaretPosition(int position)设置文本区中光标的位置设置文本区中光标的位置public int getCaretPosition()获得文本区中光标的位置获得文本区中光标的位置public voi
21、d setSelectionStart(int position)设置要选中文本的起始位置设置要选中文本的起始位置public void setSelectionEnd(int position设置要选中文本的终止位置设置要选中文本的终止位置public int getSelectionStart()获取选中文本的起始位置获取选中文本的起始位置public int getSelectionEnd()获取选中文本的终止位置获取选中文本的终止位置public void selectAll()选中文本区的全部文本选中文本区的全部文本5.4 事件处理机制 v5.4.1 Java事件处理概述v引入事件处
22、理机制后的编程基本方法如下。v(1)在java.awt中,组件实现事件处理必须使用java.awt.event包,所以在程序开始处应加入import java.awt.event.*语句。v(2)用如下语句设置事件监听者:事件源.addXxxListener(事件监听者)。v(3)事件监听者所对应的类实现事件所对应的接口XxxListener,并重写接口中的全部方法。v这样就能处理图形用户界面中的对应事件。要删除事件监听者,可以使用语句:事件源.removeXxxLitener()。v5.4.2 Java常用事件事件类事件类/接口名称接口名称接口方法与说明接口方法与说明ActionEvent
23、动作事动作事件类件类ActionListener接口接口actionPerformed(ActionEvent e)单击按钮、选择菜单项或在文本行中按回车键单击按钮、选择菜单项或在文本行中按回车键时时ComponentEvent 调调整事件类整事件类ComponentListener接口接口componentMoved(ComponentEvent e)组件移动组件移动时时componentHidden(ComponentEvent e)组件隐藏组件隐藏时时componentResized(ComponentEvent e)组件缩放组件缩放时时componentShown(ComponentE
24、vent e)组件显示组件显示时时FocusEvent 焦点事件焦点事件类类FocusListener接口接口focusGained(FocusEvent e)组件获得焦点时组件获得焦点时focusLost(FocusEvent e)组件失去焦点时组件失去焦点时ItemEvent 选择事件选择事件类类ItemListener接口接口itemStateChanged(ItemEvent e)选择复选框、单选按钮、单击列表框、选中带选择复选框、单选按钮、单击列表框、选中带复选框菜单时复选框菜单时WindowEvent 窗口窗口事件类事件类WindowListener接接口口windowOpened
25、(WindowEvent e)窗口打开后窗口打开后windowClosed(WindowEvent e)窗口关闭后窗口关闭后windowClosing(WindowEvent e)窗口关闭时窗口关闭时windowActivated(WindowEvent e)窗口激活时窗口激活时windowDeactivated(WindowEvent e)窗口失去焦点时窗口失去焦点时windowIconified(WindowEvent e)窗口最小化时窗口最小化时windowDeiconified(WindowEvent e)最小化窗口还原时最小化窗口还原时AdjustmentEvent 调整事件类调整事
26、件类AdjustmentListener接口接口adjustmentValueChanged(AdjustmentEvent e)改变滚动条滑块位置改变滚动条滑块位置v5.4.3 事件适配器vJava为那些声明了多个方法的Listener接口提供了一个对应的适配器(Adapter)类,在该类中实现了对应接口的所有方法,只是方法体为空。接接 口口 名名 称称适配器名称适配器名称接接 口口 名名 称称适配器名称适配器名称ComponentListener MouseListenerComponentAdapterMouseAdapterFocusListener MouseMotionListen
27、erFocusAdapterMouseMotionAdapterItemListener WindowListenerItemAdapterWindowAdapterKeyListener KeyAdapter 5.5 其他常用组件v5.5.1 选择框(Checkbox)v选择框分为复选框与单选按钮两种,在一组复选框中可选多项,但在一组单选按钮中只允许选一项。它们对应的类同为Checkbox。类别类别方方 法法 定定 义义功功 能能构造构造方法方法public Checkbox()创建没有名称且没有选中的复选框创建没有名称且没有选中的复选框public Checkbox(String s)创建
28、一个名称是创建一个名称是s的没有选中的复选框,名称的没有选中的复选框,名称出现在复选框右侧出现在复选框右侧public Checkbox(String s,boolean b)创建一个名称是创建一个名称是s的复选框,名称出现在复选的复选框,名称出现在复选框右侧,选中状态由参数框右侧,选中状态由参数b设定;若设定;若b取值取值为为true,则复选框为选中状态,若,则复选框为选中状态,若b取值取值为为false,则复选框为未选中状态,则复选框为未选中状态public Checkbox(String s,boolean b,CheckboxGroup g)g是是CheckboxGroup类的对象,相
29、当于一个逻类的对象,相当于一个逻辑分组。当用辑分组。当用Checkbox类创建对象,且对类创建对象,且对象属于一个逻辑分组时,创建的对象为单象属于一个逻辑分组时,创建的对象为单选按钮选按钮实例实例方法方法public boolean getState()获取选择框的选中状态获取选择框的选中状态public void setState(boolean b)设置选择框的选中状态设置选择框的选中状态public String getLabel()获取选择框显示在右侧的名称获取选择框显示在右侧的名称public void setLabel(String s)设置选择框的显示在右侧的名称设置选择框的显示
30、在右侧的名称v5.5.2 选项框(Choice)v这是用户十分熟悉的一个组件,用户可以在下拉列表中看到第一个选项,在选项右侧有一个下拉箭头,当用户单击下拉箭头时,则选项列表打开,用户可选择其中的选项。类类 别别方方 法法 定定 义义功功 能能构构造造方方法法public Choice()该方法创建一个选项框该方法创建一个选项框实实例例方方法法public void add(String name)将将name项加入到选项框中项加入到选项框中public String getItem(int index)获取位置索引编号为获取位置索引编号为index的选项名称的选项名称public int ge
31、tItemCount()获取选项框中选项的数目获取选项框中选项的数目类 别方方 法法 定定 义义功功 能能实例方法public int getSelectedIndex()获取选项框中选中项的位置索引编号获取选项框中选中项的位置索引编号public String getSelectedItem()获取选项框中选中项的名称获取选项框中选中项的名称public void insert(String item,int index)将选择项插入到指定位置索引编号处。将选择项插入到指定位置索引编号处。item代表代表要插入的项,要插入的项,index代表插入的位置索引编号代表插入的位置索引编号publi
32、c void remove(int position)从选项框中移除指定位置的一个项。从选项框中移除指定位置的一个项。position表表示位置号示位置号public void remove(String item)移除选项框中第一个出现的移除选项框中第一个出现的 itempublic void removeAll()从选项框中移除所有的项从选项框中移除所有的项public void select(int pos)将位置索引编号为将位置索引编号为pos的选项设定为选中的项的选项设定为选中的项public void select(String str)将此选项框中名称等于指定字符串将此选项框中名
33、称等于指定字符串str的项设为的项设为选中项。当选项框中有多个选项名称相同时,选中项。当选项框中有多个选项名称相同时,仅把索引编号最小的选项设为选中状态仅把索引编号最小的选项设为选中状态v5.5.3 列表框(List)v列表框与选项框均是从提供的选项中选取选项,但显示形式不同,初始时选项框只显示一项选项,但列表框初始时可显示多个选项。当列表框不足以显示出所有列表项时,自动在右侧添加滚动条。选项框只允许用户选取一个选项,但列表框可供用户选多项。在此把列表框与选项框中一些不同的方法列出.类类 别别方方 法法 定定 义义功功 能能构构造造方方法法public List()创建一个有默认可见行的列表框
34、创建一个有默认可见行的列表框public List(int n)创建一个能显示创建一个能显示n行选项的列表框行选项的列表框public List(int n,boolean b)创建一个能显示创建一个能显示n行选项,且设定了是否允许行选项,且设定了是否允许多选的列表框;当参数多选的列表框;当参数b值为值为true时,该列时,该列表框允许用户多项选择。当参数表框允许用户多项选择。当参数b值为值为false时,该列表框不允许用户多项选择时,该列表框不允许用户多项选择实实例例方方法法public String getSelectedItems()获取列表框中选中的多项名称。返回值是字符获取列表框中选
35、中的多项名称。返回值是字符串数组串数组public int getSelectedIndexes()获取选项框中选中的多项位置索引编号。返回获取选项框中选中的多项位置索引编号。返回值是整型数组值是整型数组5.6 菜 单 设 计 v菜单系统由菜单条、菜单、菜单项组成。要创建一个菜单系统,首先要有一个框架,在框架上添加菜单条,然后在菜单条中添加若干个菜单,每个菜单再添加若干菜单项。v1菜单条(MenuBar)v菜单条是一个放置菜单的容器。v(1)构造方法如下所示。vpublic MenuBar():创建一个菜单条。v(2)常用方法如下所示。vpublic Menu add(Menu m):将菜单加
36、入到菜单条中。v在设计菜单时,通过使用Frame类的setMenuBar()方法将菜单条加入到框架中标题条的下方。v2菜单(Menu)v菜单是一个放置菜单项或下一级菜单的容器。菜单对象放在菜单条对象里.类类 别别方方 法法 定定 义义功功 能能构构造造方方法法public Menu(String s)创建一个标题信息为创建一个标题信息为s的菜单的菜单实实例例方方法法public void add(MenuItem it)向菜单中加入菜单项向菜单中加入菜单项public void add(MenuItem it,MenuShortCut ms)向菜单中加入菜单项向菜单中加入菜单项it。菜单项带有
37、。菜单项带有快捷键快捷键public void addSeperator()向菜单中加入分隔线向菜单中加入分隔线public void insert(MenuItem it,int n)向菜单的指定位置加入菜单项向菜单的指定位置加入菜单项public void insert(String s,int n)向菜单中加入名称为向菜单中加入名称为s的菜单项的菜单项public void remove(int n)删除指定位置的菜单项删除指定位置的菜单项v3.菜单项v(1)构造方法如下所示。vMenuItem(String s):创建一个标题信息为s的菜单项。v(2)常用方法如下所示。vsetEnab
38、le(boolean b):设置菜单项的显示状态。当值为true时,菜单项显示,当值为false时,菜单项不显示。v说明:当菜单设计好后,要为菜单项注册事件监听器,无须为菜单条与菜单注册事件监听器,只要用户单击菜单,则自动弹出下级菜单。v4.快捷菜单v快捷菜单也称为弹出式菜单,附着在某个组件上,当在附有快捷菜单的组件上单击鼠标右键时,即显示快捷菜单。vPopupMenu类用于创建快捷菜单,其构造方法为:vpublic PopupMenu()v创建快捷菜单通常要进行如下几个步骤。v(1)把快捷菜单加入到依附的组件。方法为:组件.add(PopupMenu popmenu)。v(2)给依附的组件注
39、册鼠标事件监听器。方法为:组件.addMouseListener(listener)。v(3)实现鼠标事件接口中的方法。一般是在mouseClicked()或mouseRealease()方法中执行popmenu.show(组件,int x,int y)语句。其中组件是指弹出菜单所依附的组件,x、y设定弹出菜单的显示位置。5.7 Swing组件介绍vSwing和AWT的关系:(1)Swing构件都是AWT的Container类的直接或间接子类。v(2)Swing是对AWT的扩展,AWT是Swing的基础。v(3)Swing和AWT构件的基本使用方法相同,事件处理机制相同。v在使用时,应注意以下
40、几点。v(1)大多数情况下在AWT组件前加一个J即为Swing组件。组件基本都包含在javax.swing包中。v(2)Swing组件使用的事件模型和AWT相同,但有时除了使用java.awt.event包外,还要用到javax.swing.event包。v(3)若类的属性被命名为Jxxx,则一些相应的方法应改为getJxxx()、setJxxx()等。本 章 小 结v本章以一个学生信息录入界面的案例框架引出了图形用户界面程序设计中用到的相关知识。然后详细介绍了框架与面板组件的用法、容器组件放置其他组件时的布局方式、常用各种组件的样式与用法、事件处理程序的编写。每一部分都有具体的实例对所讲知识进行运用,最后通过学生信息注册界面设计实现案例把本章的内容进行了综合运用。