1、第 8章 图形用户界面设计教学内容 8.1概述8.2组 件的 创 建与使用8.3容器与布局管理8.4事件处理8.5Swing简介8.6应用实例8.7习题返回总目录18.1概述 AWT 简介返回目录【 引例 】 AWT实例。import java.awt.*;import java.applet.*;public class Applet2 extends Applet public void init()repaint();public void paint(Graphics g)g.drawString(“My Applet“,10,15);g.draw3DRect(0,0,100,20,t
2、rue);/绘制三维立体矩形 28.1概述 AWT 简介该引例实现了一种特殊效果的输出,即在屏幕上用一个三维立体矩形将字符串包围起来。程序中使用的 java.awt包就是 Java语言中专门用来生成图形用户界面的类库。Java语言的抽象窗口工具包 AWT( Abstract Window Toolkit)中包含了许多类来支持 GUI设计。 AWT由 Java语言的 java.awt包提供,该包中有许多用来设计 GUI的组件类,如按钮、菜单、列表、文本框等,同时它还包括窗口、面板等容器。返回目录38.1概述 基本构造方法1 paint()方法该方法的主要作用是在屏幕上显示文字,图形和其他界面元素
3、。导致浏览器调用 paint()方法的事件主要有如下 3种。( 1) Applet程序被启动之后,自动调用 paint()来重新描绘自己的界面。( 2) Applet程序所在的浏览器窗口改变时,例如,窗口放大、缩小、移动或被系统的其他部分遮挡、覆盖后又重新显示在屏幕的最前方等。 ( 3) Applet程序的其他相关方法被调用时,系统也会调用 paint()方法。2 repaint()方法该方法在 Applet程序需要重绘时随时可以调用。3 update()方法该方法由 repaint()调用,表明应该更新输出画面。当 repaint()方法被调用时,系统将首先调用 update()方法将 Ap
4、plet程序实例所占用的屏幕空间清空,然后调用 paint()方法重画之。返回目录48.2组 件的 创 建与使用 基本构造方法在 Java语言中, GUI标准组件是由 AWT包中的对象来代表的。所有的 GUI标准组件都是 java.awt.*包中的根类 Component类的子类,Component类的直接子类包括一个容器组件 Container和 8个基本组件,如 Button、 Label、 Choice、 TextComponent等。Container是所有容器组件的根类,容器组件的主要作用是包容其他组件并按一定的方式组织排列它们,同一个容器中的所有部件通常是同时被显示和同时被隐藏的。
5、所有的容器组件都是 Container类的子类,可分为 3组。第 1组为 Panel和 Applet容器,它们都是无边框的;第 2组为 ScrollPane容器,它们是可以自动处理滚动操作的容器;第 3组为 Window、 Frame、 Dialog和 FileDialog容器,它们是都含有边框,并可以进行移动、放大、缩小、关闭等操作,且具有较强功能的容器。返回目录58.2组 件的 创 建与使用 基本构造方法基本控制组件被安放在容器中的某个位置,它的作用是用来完成一种具体地与用户交互的功能,包括接收用户的一个命令、接收用户的一个文本或选择输入、向用户显示一段文本或一个图形等。目前常用的控制组件
6、有命令按钮、单选按钮、复选框、下拉列表、文本框等,引例中就使用了按钮和文本框组件 。返回目录68.2组 件的 创 建与使用 文本组件文本组件( TextComponent)类是用于编辑文本的组件,此类包括了文本框( TextField)和多行文本区域( TextArea)两种子类。1 TextField类TextField类用于编辑单行文本,它只有一行。 TextField类提供了多种构造方法,用于创建文本框组件的对象。常见构造方法使用如下:TextField name1=new TextField();TextField name2=new TextField(int columns);Te
7、xtField name3=new TextField(String text);TextField name4=new TextField(String text , int columns);其中, text为文本框初始字符串, columns为文本框容纳字符的个数。返回目录78.2组 件的 创 建与使用 文本组件2 TextArea类TextArea类提供可以编辑或显示多行文本的区域,并且在编辑器内可以见到水平与垂直滚动条。 TextArea类提供了多种构造方法,用于创建文本区域组件的对象。常见构造方法的使用如下:TextArea textArea1=new TextArea();Tex
8、tArea textArea2=new TextArea(int rows , int columns);TextArea textArea3=new TextArea(String text);TextArea textArea4=new TextArea(String text , int rows , int columns);TextArea textArea5=new TextArea(String text , int rows , int columns , int scrollbars);返回目录88.2组 件的 创 建与使用 文本组件其中, rows和 columns分别表示
9、新建文本区的行数和列数, text为文本区域中初始字符串, scrollbars表示在文本区域中可见滚动条。例如,如果想创建 20行 4列的文本区域,可以使用如下的构造方法实现:TextArea text2=new TextArea(20,4)。3 TextComponent类中的常用方法TextComponent类中的方法都适用于 TextField类和 TextArea类,原因是 TextField类和 TextArea类都是它的子类。 返回目录98.2组 件的 创 建与使用 文本组件TextComponent类中的常用方法如下表所示返回目录108.2组 件的 创 建与使用 文本组件Tex
10、tField类中的常用方法如表下表所示返回目录118.2组 件的 创 建与使用 文本组件TextArea类中的常用方法如下表所示返回目录128.3容器与布局管理 容器容器类都是从 Component类继承而来的,它可以作为对象容纳任何的可视元素。在各种复杂的用户接口中,容器使得放置组件的操作变得特别容易。容器类( Container)有两个主要类型: Panel(面板)和 Window(窗口)。1面板面板( Panel)是 Java语言中最为通用的容器。对复选框与按钮而言,这是个非常完美的容器。 Panel是从 Container类直接继承的,它可以被包含在另一个容器中,或是在 Web浏览器窗
11、口中。当需要摆放许多元素时,就需要将元素按其逻辑关系进行分组,然后放入 Panel中,这可以简化处理过程。Panel显示一个四边形,其他组件可以放入其中。需要注意的是,Panel必须放在 Window之中(或在 Window的子类中)才能显示出来。引例中 3个 Panel对象都被包含在一个框架对象中。返回目录138.3容器与布局管理 容器2窗口窗口( Window)与 Panel一样,是个通用容器类,但与 Panel不同的是, Window有一个独立于 Web浏览器或 appletviewer窗口的窗口。程序员不能直接使用 Window类,但可以使用它的 3个子类,即 Frame(框架)、 D
12、ialog(对话框)和 FileDialog(文件对话框)。Frame是一个带有标题和缩放角的窗口,它有自己的外边框和自己的标题,创建 Frame时可以指定其窗口标题。例如,引例中创建 Frame标题为 “我的窗口 ”,每个 Frame在其右上角都有 3个控制图标,分别代表将窗口最大化、最小化和关闭的操作。其中,最大化和最小化操作Frame可自动完成,而关闭窗口的操作不能通过单击关闭图标实现,需要编写专门的程序代码完成。Frame是 Java语言中最重要、最常用的容器之一,是 Java应用程序的图形用户界面容器。作为一个应用程序最外层的容器,它可以被其他容器创建并弹出成为独立的容器。Dialo
13、g没有菜单条,尽管它能移动,但它不能缩放。 Dialog可以提醒用户进行所需要的输入或者反馈应答消息。而 File Dialog有菜单条,可移动、缩放。返回目录148.3容器与布局管理 容器3容器的嵌套容器的嵌套是 Java程序 GUI界面设计和实现中经常用到的手段,引例中存在如下图所示的包含层次关系。这个程序最上层的容器是一个 Frame(框架),其中包含了 3个组件:第一个组件是一个 Panel对象 p1,包含一个标签对象 1b1;第二组件是另一个 Panel对象 p2,包含一个标签对象 1b2;第 3个组件是另一个 Panel对象 p3,包含一个标签对象 1b3和一个按钮 btn。 返回
14、目录158.3容器与布局管理 使用布局管理器来组织接口当在 Applet程序中使用了 3个或更多的组件时,布局管理器(layout mangager)不可缺少。没有它们,很难快速组织好屏幕元素的布局。 java.awt包中共定义了 5种布局管理器类,它们分别是FlowLayout、 BorderLayout、 CardLayout、 GridLayout和GridBagLayout。每个布局管理器类对应一种布局策略。当一个容器选定一种布局策略时,它应该创建该策略对应的布局管理器类的对象,并将此对象设置为自己的布局管理器。没有布局管理器的容器,其中的对象会互相覆盖、遮挡,影响使用,所以必须为每个
15、容器设置一个合适的布局管理器。没有指明布局管理器,则所有的容器都使用默认的 FlowLayout布局策略。返回目录168.3容器与布局管理 使用布局管理器来组织接口1 FlowLayoutFlowLayout是容器 Panel和 Applet程序默认使用的布局管理策略。创建 FlowLayout类的对象可以使用下面的方法。FlowLayout():设置一个 FlowLayout对象。对齐方式为居中,组件间的横纵间距都为 5个像素。FlowLayout(int align, int hgap, int vgap): align指定每行组件的对齐方式,可以取 LEFT、 CENTER、 RIGHT
16、三个常量之一; hgap和 vgap分别指定各组件间的横向和纵向间的以像素为单位的间距。FlowLayout(int align): align指定每行组件的对齐方式,组件间的横纵间距都为 5个像素。创建完 FlowLayout对象后,必须使用 setLayou()方法进行设定,才能有效。返回目录178.3容器与布局管理 使用布局管理器来组织接口2 BorderLayoutBorderLayout也是一种简单的布局策略,它把容器内的空间简单地划分为东、西、南、北、中 5个区域,每加入一个组件都应该指明把这个组件加在哪个区域中。创建 BorderLayout类的对象可以使用下面的方法。Borde
17、rLayout():设置一个 BorderLayout对象。它规定各组件间的横、纵间距都为 0。BorderLayout(int hgap, int vgap): hgap和 vgap分别规定各组件间的横纵间距。BorderLayout只能指定 5个区域位置。如果容器中需要加入 5个以上组件,就必须使用容器的嵌套或改用其他的布局策略。创建完 BorderLayout对象后,必须使用 setLayout()方法进行设定,才能有效。返回目录188.3容器与布局管理 使用布局管理器来组织接口3 CardLayout使用 CardLayout的容器表面上可以容纳多个组件,但是实际上同一时刻容器只能从这
18、些组件中选出一个来显示,就像一叠 “扑克牌 ”每次只能显示最上面的一张一样,这个被显示的组件将占据所有的容器空间。使用 CardLayout的一般步骤如下。( 1)创建 CardLayout对象作为布局管理器: Mycard=new CardLayout()。( 2)使用容器的 setLayout()方法为容器设置布局管理器:setLayout(Mycard)。( 3)使用 add(字符串 ,组件 )方法将该容器的每个组件添加到容器,同时为每个组件分配一个字符串的名字,以便布局管理器根据这个名字调用显示这个组件。 ( 4)使用 show(容器名 , 字符串 )方法可以按第 3步分配的字符串名字
19、显示相应的组件;也可按组件加入容器的顺序显示组件,如 first(容器名 )方法显示第一个组件, last(容器名 )方法显示最后一个组件等。198.3容器与布局管理 使用布局管理器来组织接口4 GridLayoutGridLayout是使用较多的布局管理器,其基本布局策略是把容器的空间划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小格中。GridLayout比较灵活,划分多少网格由程序自由控制,而且组件定位也比较精准。使用 GridLayout布局管理器的一般步骤如下。( 1)创建 GridLayout对象作为布局管理器。指定划分网格的行数和列数,并使用容器的 setLayout(
20、)方法为容器设置这个布局管理器:setLayout (new gridLayout(行数 ,列数 )。 ( 2)调用容器的方法 add()将组件加入容器。组件填入容器的顺序将按照第一行第一个、第二行第二个、 、第一行最后一个、第二行第一个、 、最后一行最后一个进行。每个网格中都必须填入组件,如果希望某个网格为空格,可以为它加入一个空的标签,例如, add(new Lable() )。208.3容器与布局管理 使用布局管理器来组织接口5 GrigBagLayoutGrigBagLayout是 5种布局策略中使用最复杂、功能最强大的一种,它是在 GridLayout的基础上发展而来的。因为 Gri
21、gLayout中的每个网格都是大小相同,并且强制组件与网格大小也相同,从而使得容器中的每个组件也都是相同的大小,显得很不自然,而且组件加入容器也必须按照固定的行列顺序,因此不够灵活。在GrigBagLayout中,可以为每个组件加入指定其包含的网格个数,可以保留组件原来的大小,可以以任意顺序随意加入容器的任意位置,从而可以真正自由地安排容器中每个组件的大小和位置。218.4事件 处 理 概述事件表达了程序、系统及使用程序的用户之间的动作。当用户做某些事情,如用户在程序窗口中单击,系统将创建一个响应表达该动作的事件,并传送该事件给程序中的事件处理代码,该代码决定了怎样处理事件,以便让用户得到相应
22、的回应。228.4事件 处 理 标签、按钮与动作事件1标签( Label)标签是用户不能修改只能查看其内容的文本显示区域,它起到信息说明的作用,每个标签用一个 Label类的对象表示。Label提供的构造方法如下:( 1) Label()。( 2) Label (String text)。( 3) Label (String text, int alignment);。其中, text为标签上显示的文本; alignment是对齐方式,有 3个值: CENTER、 LEFT、 RIGHT。238.4事件 处 理 标签、按钮与动作事件2按钮( Button)按钮是图形用户界面中非常重要的的一种组
23、件,它一般对应一个事先定义好的功能操作,并对应一段程序。当用户单击按钮时,系统自动执行与按钮相关联的程序,从而完成预先指定的功能。 Button提供的构造方法如下:( 1) Button()。( 2) Button(String text)。其中,第二种方式指定了按钮上的标签文字。调用按钮的 getLabel()方法可以返回按钮上的标签字符串,调用按钮的 setLabel()方法可以修改按钮的标签字符串。按钮可以引发动作事件,当用户单击一个按钮时会引发一个动作事件。如果希望响应按钮引发动作事件的程序,必须把按钮注册给实现了 ActionListener接口的动作事件监听者,同时,为这个接口的a
24、ctionPerformed (ActionEvent e)方法书写方法体。在方法体中,可以调用 e.getSource()方法获取引发动作事件的按钮对象,也可以调用e.getActionCommand()方法来获取按钮的标签或事先为这个按钮设置命令名。248.4事件 处 理 标签、按钮与动作事件3动作事件( ActionEvent)ActionEvent类只包含一个事件,即执行动作事件 ACTION-PERFORMED,它是由某个动作引发的执行事件。能够触发这个事件的动作包括以下几个。( 1)单击按钮。( 2)双击一个列表中的选项。( 3)选择菜单项。( 4)在文本框中输入内容后回车。Act
25、ionEvent类的主要方法有以下几个。( 1) public String getActionCommand()。( 2) public int getModifiers()。258.4事件 处 理 文本事件文本事件( TextEvent)类只包括一个事件,即代表文本区中文本变化的事件 TEXT-VALUE-CHANGED。例如,输入字符、删除字符都将引发这个事件。这个事件比较简单,不需要特别判断事件类型的方法和常量。该事件通常在文本框或文本域组件内容发生变化时被引发。 TextEvent类产生的事件,经 TextListener接口触发动作,再由 TextValueChanged()方法去
26、完成这些动作。由于 TextField对象只允许有一行,所以实际上它比 TextArea多产生一种事件,如在引例中,用户在文本框中按回车键时,将引发代表动作事件的 ActionEvent事件, ActionListener可以通过actionPerformed()知道这个事件。268.4事件 处 理 单选按钮、复选框与列表事件1选择事件( ItemEvent) ItemEvent类只包含一个事件,即代表选择项的选中状态发生变化的事件常量 ITEM-STATE-CHANGED。引发这类事件的动作包括以下几个。( 1)改变列表类 List对象中选项的选中或不选中状态。( 2)改变下拉列表类 Cho
27、ice对象中选项的选中或不选中状态。( 3)改变复选框类 Checkbox对象的选中或不选中状态。( 4)改变检测盒菜单项 CheckboxMenuItem对象的选中或不选中状态。ItemEvent类的主要方法有以下几个。( 1) public ItemSelectable getItemSelectable():得到选中的事件源。( 2) public Object getItem():得到选中的选择项。( 3) public int getStateChange():得到选中项的状态变化类型,它的返回值可能是下面两个静态常量之一。 ItemEvent.selected:代表选项被选中。 I
28、temEvent.deselectde:代表选项被放弃。278.4事件 处 理 单选按钮、复选框与列表事件2复选框( Checkbox)Checkbox组件提供一种简单的 “开 /关 ”输入设备,它旁边有一个文本标签。每个复选框只有两种状态: true表示选中, false表示未被选中。创建复选框对象时可以同时指明其文本标签,这个文本标签简要地说明了复选框的意义和作用。复选框的构造方法如下:( 1) Checkbox()。( 2) Checkbox(String str, boolean tf)。其中, str指明对应的文本标签; tf是一个逻辑值,或为 true,或为 false。288.4
29、事件 处 理 单选按钮、复选框与列表事件3单选按钮组( CheckboxGroup) 单选按钮组将多个复选框构成一组,该组内的所有复选框是互斥的,即在任何时刻,这个单选按钮组中只有一个复选框的值是 ture,其他均为 fasle。当前被选中的复选框的值为 ture。在程序中可以使用单选框按钮组的构造方法来创建一个单选按钮组,再在这组中增加复选框,就可以完成单选按钮组的创建。单选按钮组用 CheckboxGroup类的对象表示。在声明单选按钮组时,可以用如下方法声明。CheckboxGroup radio=new CheckboxGroup(); /单选按钮构造方法add(new Checkbo
30、x(“YES“,radio,ture);/在单选按钮组创建第 1个复选框add(new Checkbox(“NO“,radio,false);/在单选按钮组创建第 2个复选框add(new Checkbox(“CANCEL”,radio,fasle);/在单选按钮组创建第 3个复选框298.4事件 处 理 单选按钮、复选框与列表事件4下拉列表( Choice)是实现多选一的输入界面,与单选按钮不同的是它将所有的选项折叠收藏起来,只显示最前面的或被用户选中的一个。有如下方式:Choice color=new Choice(); /下拉列表的构造方法Color.add(“红色 “); /将字符串加
31、入下拉列表中Color.add(“绿色 “); Color.add(“蓝色 “);下拉列表常用的方法包括以下几种。add(String item):加入一个列表项到下拉列表中。getSelectedlndex():获得目前所选项的索引(第一项序号为 0,以此类推)。getSelectedItem():获得选中列表项的标签为本字符串。insert(String item, int index):加入一个列表项到指定的位置。remove(int index):删除指定序号的列表项。removeAll():将下拉列表中所有选项删除。select(int index):选中指定序号的列表项。select(String item):选中指定文本内容的选项。30