Java语言实用教程第8章.ppt
第第8章章 图形用户界面图形用户界面8.1 组件组件8.2 组件布局管理组件布局管理8.3 事件处理方法事件处理方法习题习题GUI(graphicuserinterface)的的中中文文意意思思是是图图形形用用户户界界面面。在在GUI中中,用用户户可可以以看看到到什什么么就就操操作作什什么么,取取代代了了以以往往字字符符方方式式下下知知道道是是什什么么后后才才能能操操作作的的方方式式,极极大大地地方方便便了了用用户户对对计计算算机机的的操操作作,GUI现现在在已已经经成成为当前的编程标准。为当前的编程标准。Java语语言言可可以以编编写写出出良良好好的的图图形形用用户户界界面面,因因为为它它提提供供了了图图形形用用户户界界面面所所需需要要的的基基本本组组件件,如如窗窗口口、按按钮钮、文文本本框框、选选择择框框、滚滚动动条条等等,Java类类库库java.awt包包含含了所有这些基本组件。了所有这些基本组件。本章的任务是了解图形用户界面基本组件的使用方法,本章的任务是了解图形用户界面基本组件的使用方法,了解如何使用布局管理器对组件进行管理,以及如何了解如何使用布局管理器对组件进行管理,以及如何使用使用Java的事件处理机制。的事件处理机制。组件(组件(Component)是构成是构成GUI的基本要素,通过对的基本要素,通过对不同事件的响应来完成和用户的交互或组件之间的交不同事件的响应来完成和用户的交互或组件之间的交互。组件一般作为一个对象放置在容器互。组件一般作为一个对象放置在容器(Container)内,容器是能容纳和排列组件的对象,内,容器是能容纳和排列组件的对象,如如Applet、Panel、Frame等。组件通过容器的等。组件通过容器的add方方法加入到容器中。法加入到容器中。8.1组件组件1.创建标签创建标签标标签签(Label)的的功功能能是是显显示示单单行行的的字字符符串串,可可在在屏屏幕上显示一些提示性、说明性的文字。幕上显示一些提示性、说明性的文字。例例8.1创建标签,结果如图创建标签,结果如图8.1所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassLabel1extendsAppletpublicvoidinit()Labellabel1=newLabel();Labellabel2=newLabel(欢迎你使用标签!欢迎你使用标签!);Labellabel3=newLabel(这是一个写标签的例子这是一个写标签的例子,Label.RIGHT);add(label1);add(label2);8.1.1标签标签add(label3);图图8.12.标签的构造方法标签的构造方法(1)Label()该该方方法法用用来来创创建建一一个个没没有有显显示示内内容容的的对象。对象。(2)Label(Stringlabel)该该方方法法用用来来创创建建一一个个显显示示内容为内容为label的对象。的对象。(3)Label(Stringlabel,intalignment)该该方方法法除除了了用用来来创创建建一一个个显显示示内内容容为为label的的对对象象外外,还还设设置置了了Label的对齐方式。的对齐方式。Label的对齐方式有的对齐方式有3种,分别用种,分别用Label类的类的3个常量个常量LEFT、CENTER和和RIGHT来表示左对齐、居中对来表示左对齐、居中对齐和右对齐。齐和右对齐。3.标签的常用方法标签的常用方法(1)publicintgetAlignment()返回当前的对齐方式。返回当前的对齐方式。(2)publicStringgetText()返回当前显示的字符串。返回当前显示的字符串。(3)publicvoidsetAlignment(intalignment)设设置置对对齐方式。齐方式。(4)publicvoidsetText(Stringlabel)设置显示的字设置显示的字符串。符串。Java提供了标准按钮(提供了标准按钮(Button),),可带有文字标题。可带有文字标题。1.创建按钮创建按钮例例8.2创建按钮,结果如图创建按钮,结果如图8.2所示。所示。importjava.awt.*;importjava.applet.AppletpublicclassButton1extendsAppletButtonbutton=newButton(确定确定);publicvoidinit()add(button);8.1.2按钮按钮图图8.2在例在例8.2中,中,button是作为主类的一个对象成员创建是作为主类的一个对象成员创建的,因此,主类的所有方法都可以使用它。参数的,因此,主类的所有方法都可以使用它。参数“确确定定”指定了按钮上显示的标题。指定了按钮上显示的标题。2.按钮的构造方法按钮的构造方法(1)Button()创建一个没有标题的按钮。创建一个没有标题的按钮。(2)Button(Stringlabel)创创建建一一个个有有显显示示标标题题的的按按钮。钮。3.按钮的常用方法按钮的常用方法(1)publicStringgetLabel()返回按钮的显示标题。返回按钮的显示标题。(2)publicvoidsetLabel(Stringlabel)设置按钮上设置按钮上的显示标题。的显示标题。选项框(选项框(Choice)又称下拉式列表。这种选项框一次又称下拉式列表。这种选项框一次只能显示一个选项,要改变被选中的选项,可以单击只能显示一个选项,要改变被选中的选项,可以单击下拉箭头,从选项框中选择一个选项。下拉箭头,从选项框中选择一个选项。8.1.3选项框选项框1.创建选项框创建选项框例例8.3创建选项框,结果如图创建选项框,结果如图8.3所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassChoice1extendsAppletpublicvoidinit()Labellabel=newLabel(选项框的例子选项框的例子);Choicec=newChoice();c.addItem(北北京京);c.addItem(上上海海);c.addItem(天天津津);c.addItem(南南京京);c.addItem(郑郑州州);c.addItem(武武汉汉);add(c);add(label);图图8.32.选项框的常用方法选项框的常用方法(1)publicvoidaddItem(Stringitem)向向选选项项框框中中加入选项加入选项item。(2)publicintcountItem()返返回回选选项项框框中中的的选选项项个个数。数。(3)publicStringgetItem(intindex)返返回回指指定定下下标标值的某个选项。值的某个选项。(4)publicintgetSelectIndex()返返回回被被选选中中的的选选项项的下标值。的下标值。(5)publicStringgetSelectItem()返返回回被被选选中中的的选选项。项。(6)publicvoidselect(intpos)选选择择指指定定下下标标值值的的选选项。项。(7)publicvoidselect(Stringstr)选择指定的选项。选择指定的选项。复选框(复选框(Checkbox)可以让用户作出多项选择。选可以让用户作出多项选择。选项按钮(项按钮(CheckboxGroup)又称单选框,是一组按又称单选框,是一组按钮,用户只能选择其中的一个。钮,用户只能选择其中的一个。8.1.4复选框和选项按钮复选框和选项按钮1.创建复选框创建复选框例例8.4创建复选框,结果如图创建复选框,结果如图8.4所示。所示。图图8.4例例8.4创建复选框,结果如图创建复选框,结果如图8.4所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassCheck1extendsAppletfinalstaticintCITY_NUM=6;Stringcity=北京北京,上海上海,天津天津,南京南京,郑州郑州,武汉武汉;Checkboxc=newCheckbox6;Labellabel=newLabel(这是一个复选框的例子这是一个复选框的例子);publicvoidinit()add(newLabel(请选择中国的大城市:请选择中国的大城市:);for(inti=0;iCITY_NUM;i+)ci=newCheckbox(cityi);add(ci);add(label);例例8.5创建选项按钮,结果如图创建选项按钮,结果如图8.5所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassCheck2extendsAppletfinalstaticintCITY_NUM=6;Stringcity=北京北京,上海上海,天津天津,南京南京,郑州郑州,武汉武汉;Checkboxradio=newCheckbox6;Labellabel=newLabel(这是一个选项按钮的例子这是一个选项按钮的例子);publicvoidinit()CheckboxGroupc=newCheckboxGroup();add(newLabel(请选择中国最大的城市:请选择中国最大的城市:);for(inti=0;iCITY_NUM;i+)radioi=newCheckbox(cityi,c,false);add(radioi);add(label);图图8.52.复选框和选项按钮的构造方法复选框和选项按钮的构造方法(1)Checkbox()创建一个没有标签的复选框。创建一个没有标签的复选框。(2)Checkbox(北京北京)创建有标签的复选框。创建有标签的复选框。(3)CheckboxGroup()创建选项按钮。创建选项按钮。要要 生生 成成 选选 项项 按按 钮钮,必必 须须 先先 生生 成成 一一 个个 类类CheckboxGroup的对象,例如:的对象,例如:checkboxGroup1=newCheckboxGroup();然后再使用下面的语句:然后再使用下面的语句:checkbox1=newCheckbox(Radio,checkboxGroup1,false);其中第一个参数是选项按钮的标签,第二个参数是选其中第一个参数是选项按钮的标签,第二个参数是选项按钮对象,第三个参数表示该选项按钮创建时,是项按钮对象,第三个参数表示该选项按钮创建时,是否被选中(否被选中(true表示选中)。表示选中)。3.复选框和选项按钮的常用方法复选框和选项按钮的常用方法(1)publicCheckboxGroupgetCheckboxGroup()返回选项按钮所属的复选框组。返回选项按钮所属的复选框组。(2)publicStringgetLabel()返返回回复复选选框框或或选选项项按按钮的标签。钮的标签。(3)publicBooleangetState()返返回回复复选选框框或或选选项项按按钮是否被选中。钮是否被选中。(4)public void setCheckboxGroup(CheckboxGroupg)设置选项按钮所属复选框组。设置选项按钮所属复选框组。(5)publicvoidsetLabel(Stringlabel)设设置置复复选选框框或选项按钮的标签。或选项按钮的标签。(6)publicvoidsetState(Booleanstate)设设置置复复选选框框或选项按钮被选中与否。或选项按钮被选中与否。列表框(列表框(List)可以使用户选择多个选项。列表框的可以使用户选择多个选项。列表框的所有选项都是可见的,如果选项数目超出了列表框可所有选项都是可见的,如果选项数目超出了列表框可见区的范围,则列表框右边会出现一个滚动条。见区的范围,则列表框右边会出现一个滚动条。8.1.5列表框列表框例例8.6创建列表框、添加选项,结果如图创建列表框、添加选项,结果如图8.6所示。所示。图图8.6importjava.awt.*;importjava.applet.Applet;publicclassList1extendsAppletListlist1=newList();Listlist2=newList(6,true);publicvoidinit()add(newLabel(这是一个列表框的例子这是一个列表框的例子);list1.add(长江长江);list1.add(黄河黄河);list1.add(淮河淮河);add(list1);list2.add(北京大学北京大学);list2.add(清华大学清华大学);list2.add(吉林大学吉林大学);list2.add(复旦大学复旦大学);list2.add(南开大学南开大学);list2.add(天津大学天津大学);list2.add(南京大学南京大学);add(list2);说明:说明:构造方法中的第一个参数指定了在列表框里显示选项构造方法中的第一个参数指定了在列表框里显示选项的个数。第二个参数若为的个数。第二个参数若为false,表示这个列表框是单表示这个列表框是单选的,若为选的,若为true,则表示是多选的。无参构造方法将则表示是多选的。无参构造方法将创建一个默认大小的列表框。创建一个默认大小的列表框。文文本本框框(TextField)用用来来接接受受用用户户键键盘盘输输入入的的单单行行文文本信息。本信息。1.创建文本框创建文本框例例8.7创建两个不同的文本框,结果如图创建两个不同的文本框,结果如图8.7所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassText1extendsAppletpublicvoidinit()add(newLabel(用户名用户名);add(newTextField(请输入用户名请输入用户名,20);add(newLabel(口令口令);add(newTextField(20);8.1.6文本框文本框图图8.72.文本框的构造方法文本框的构造方法(1)TextField()创建一个默认长度的文本框。创建一个默认长度的文本框。(2)TextField(intcolumns)创创建建一一个个指指定定长长度度的的文文本框。本框。(3)TextField(Stringtext)创创建建一一个个带带有有初初始始文文本本内容的文本框。内容的文本框。(4)TextField(Stringtext,intcolumns)创创建建一一个个带带有初始文本内容并具有指定长度的文本框。有初始文本内容并具有指定长度的文本框。3.文本框的常用方法文本框的常用方法(1)publicvoidsetEchoChar(charc)设设定定用用户户输输入入字字符符的的回回显显字字符符,例例如如输输入入口口令令时时可可设设定定回回显显字字符符“*”来屏蔽。来屏蔽。(2)publicvoidsetText(Stringt)设定文本框的文本设定文本框的文本内容。内容。与与文文本本框框只只显显示示一一行行不不同同,文文本本区区(TextArea)可可以以显示大段的文本。显示大段的文本。1.创建文本区创建文本区例例8.8创建两个不同的文本区,结果如图创建两个不同的文本区,结果如图8.8所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassTextAreaDemoextendsAppletpublicvoidinit()TextAreata1=newTextArea(这里是文本区这里是文本区1,8,20);add(ta1);ta1.setEditable(false);TextAreata2=newTextArea(这里是文本区这里是文本区2,8,20);add(ta2);8.1.7文本区文本区ta2.setEditable(true);图图8.82.文本区的构造方法文本区的构造方法(1)TextArea()创建一个默认大小的文本区。创建一个默认大小的文本区。(2)TextArea(introws,intcolumns)创创建建一一个个指指定定行和列数的文本区。行和列数的文本区。(3)TextArea(Stringtext)创创建建一一个个带带有有初初始始文文本本内容的文本区。内容的文本区。(4)TextArea(Stringtext,introws,intcolumns)创创建建一一个个带带有有初初始始文文本本内内容容并并具具有有指指定定行行和和列列数数的的文文本本区。区。(5)TextArea(Stringtext,introws,intcolumns,intscrollbars)在(在(4)的基础上添加滚动条。)的基础上添加滚动条。3.文本区的常用方法文本区的常用方法(1)publicvoidappend(Stringstr)在在文文本本区区尾尾部部添添加文本。加文本。(2)publicvoidinsert(Stringstr,intpos)在在文文本本区区指定位置插入文本。指定位置插入文本。(3)publicvoidsetText(Stringt)设定文本区内容。设定文本区内容。(4)publicintgetRows()返回文本区的行数。返回文本区的行数。(5)publicvoidsetRows(introws)设设定定文文本本区区的的行行数。数。(6)publicintgetColumns()返回文本区的列数。返回文本区的列数。(7)publicvoidsetColumns(intcolumns)设设定定文文本本区的列数。区的列数。(8)publicvoidsetEditable(booleanb)设设定定文文本本区区的可编辑状态。的可编辑状态。从上面创建组件的例子可以知道,要创建组件先要创从上面创建组件的例子可以知道,要创建组件先要创建组件对象,然后添加对象到容器中。建组件对象,然后添加对象到容器中。在上面的例子中,组件的位置由容器的默认布局管理在上面的例子中,组件的位置由容器的默认布局管理器摆放,这样当组件较多时窗口就会显得凌乱。如何器摆放,这样当组件较多时窗口就会显得凌乱。如何控制组件的摆放位置呢?本节介绍的布局管理器就是控制组件的摆放位置呢?本节介绍的布局管理器就是解决这个问题的。解决这个问题的。8.2组件布局管理组件布局管理顺顺序序布布局局(FlowLayout)是是最最基基本本的的一一种种布布局局,是是面面板板(Panel)及及其其子子类类Applet的的默默认认布布局局方方式式,前前面面介介绍绍的的例例子子都都使使用用了了默默认认的的顺顺序序布布局局。Panel是是一一个个容容器器,可可以以容容纳纳多多个个组组件件,作作为为它它的的子子类类,Applet也具有容纳组件的能力。也具有容纳组件的能力。顺序布局指的是把组件一个接一个地从左到右顺序排顺序布局指的是把组件一个接一个地从左到右顺序排列,一行排满后就转到下一行继续排列,直到把所有列,一行排满后就转到下一行继续排列,直到把所有组件都显示出来。它将根据容器的大小随时调整它里组件都显示出来。它将根据容器的大小随时调整它里面的组件的大小,包括高度和宽度,这个管理器不会面的组件的大小,包括高度和宽度,这个管理器不会约束组件的大小,而是允许它们获得自己的最佳大小。约束组件的大小,而是允许它们获得自己的最佳大小。8.2.1顺序布局顺序布局边界布局(边界布局(BorderLayout)把容器(这里是把容器(这里是Applet)分为分为5个区:个区:北区、南区、东区、西区和中区。这几北区、南区、东区、西区和中区。这几个区的分布规律是个区的分布规律是“上北下南,左西右东上北下南,左西右东”,与地图,与地图的方位相同。组件可以指定自己放在哪个区内,因为的方位相同。组件可以指定自己放在哪个区内,因为只有只有5个区,所以最多只能容纳个区,所以最多只能容纳5个组件,否则要采取个组件,否则要采取其他布局方式。其他布局方式。8.2.2边界布局边界布局例例8.9使用边界布局添加使用边界布局添加5个组件,结果如图个组件,结果如图8.9所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassBorder1extendsAppletButtonbN,bS,bW,bE,bC;publicvoidinit()setLayout(newBorderLayout();bN=newButton(北北);bS=newButton(南南);bE=newButton(东东);bW=newButton(西西);bC=newButton(中中);add(North,bN);add(South,bS);add(East,bE);add(West,bW);add(Center,bC);图图8.9说明:说明:在在add方法中,第一个参数表示组件的摆放位方法中,第一个参数表示组件的摆放位置,必须从置,必须从North、South、East、West、Center中选中选择一个。第二个参数是组件对象名。择一个。第二个参数是组件对象名。卡片布局(卡片布局(CardLayout)将组件像卡片一样叠放起将组件像卡片一样叠放起来,每次只显示一个。因此需要使用某种方法翻阅这来,每次只显示一个。因此需要使用某种方法翻阅这些卡片,参见例些卡片,参见例8.10。8.2.3卡片布局卡片布局例例8.10组件的卡片布局,如图组件的卡片布局,如图8.10所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassCard1extendsAppletCardLayoutcard=newCardLayout();publicvoidinit()setLayout(card);setFont(newFont(Arial,Font.PLAIN,24);for(inti=1;i=5;i+)add(String.valueOf(i),newButton(卡片号为:卡片号为:+i);card.show(this,String.valueOf(2);图图8.10使用卡片布局时,先要创建一个卡片布局管理器对象,使用卡片布局时,先要创建一个卡片布局管理器对象,例如程序中创建的例如程序中创建的card对象。然后用对象。然后用setLayout(card)设定容器的布局方式。由于布局管理器将组件叠放起设定容器的布局方式。由于布局管理器将组件叠放起来时要确定组件的编号,这可通过来时要确定组件的编号,这可通过add(字符串编号字符串编号,组件组件)方法来加入组件。显示一个组件时要通过布局方法来加入组件。显示一个组件时要通过布局管理器的管理器的show方法,它需要两个参数:方法,它需要两个参数:容器对象名容器对象名和组件的字符串编号。和组件的字符串编号。网格布局(网格布局(GridLayout)把容器(这里是把容器(这里是Applet)区区域分成若干个网格,每个网格可以放置一个组件,这域分成若干个网格,每个网格可以放置一个组件,这种布局方式对数量众多的组件很合适。创建网格布局种布局方式对数量众多的组件很合适。创建网格布局管理器时,可以给出网格的行数和列数。管理器时,可以给出网格的行数和列数。8.2.4网格布局网格布局例例8.11组件的网格布局如图组件的网格布局如图8.11所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassGrid1extendsAppletButtonb1,b2,b3,b4,b5,b6;publicvoidinit()setLayout(newGridLayout(3,3);/设置为设置为3行行3列共列共9个网格个网格b1=newButton(按钮按钮1);b2=newButton(按钮按钮2);b3=newButton(按钮按钮3);b4=newButton(按钮按钮4);b5=newButton(按钮按钮5);b6=newButton(按钮按钮6);add(newLabel(label1);add(b1);add(b2);add(b3);add(newLabel();add(b4);add(b5);add(b6);add(newLabel(label2);图图8.11网格数可以比组件多,但不能少。如果希望某个网格网格数可以比组件多,但不能少。如果希望某个网格为空白,可以为它加上一个空标签。在网格布局中也为空白,可以为它加上一个空标签。在网格布局中也可以添加间距,如可以添加间距,如setLayout(newGridLayout(3,3,10,10)将网格之间设为将网格之间设为10个点。个点。面面板板(Panel)是是一一个个无无边边框框的的容容器器,可可以以包包容容其其他他组组件件或或另另一一个个面面板板。使使用用面面板板的的目目的的是是为为了了分分层层次次、分分区区域域管管理理各各种种组组件件,通通过过各各个个面面板板的的布布局局管管理理器器对对本本身身的的组组件件进进行行管管理理,互互不不妨妨碍碍,这这样样就就可可以以使使布布局局更加合理和美观。更加合理和美观。在前面的例子里没有使用面板,在前面的例子里没有使用面板,Applet本身就是一个本身就是一个特殊的面板,现在来看看如何在特殊的面板,现在来看看如何在Applet中添加面板进中添加面板进行组件布局。行组件布局。8.2.5面板的使用面板的使用例例8.12用面板控制组件布局,结果如图用面板控制组件布局,结果如图8.12所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassPanel1extendsAppletpublicvoidinit()setLayout(newBorderLayout();setForeground(Color.black);setFont(newFont(Arial,Font.PLAIN,20);add(North,newLabel(我在我在Applet中中,Label.CENTER);Panelpanel1=newPanel();add(West,panel1);panel1.setBackground(Color.blue);panel1.setForeground(Color.red);panel1.setLayout(newBorderLayout();panel1.add(East,newButton(东东);panel1.add(West,newButton(西西);panel1.add(Center,newLabel(我在我在Panel1中中);Panelpanel2=newPanel();add(East,panel2);panel2.setBackground(Color.green);panel2.setLayout(newBorderLayout();panel2.add(North,newLabel(我在我在Panel2中中);panel2.add(South,newButton(我在我在Panel2中中);图图8.12Java允许使用手工布局放置各个组件,这种方法比较允许使用手工布局放置各个组件,这种方法比较灵活。灵活。例例8.13手工放置组件,结果如图手工放置组件,结果如图8.13所示。所示。importjava.awt.*;importjava.applet.Applet;publicclassNo1extendsAppletChoicec=newChoice();Buttonb1=newButton(Button1);Buttonb2=newButton(Button2);Buttonb3=newButton(Button3);publicvoidinit()setLayout(null);8.2.6手工布局手工布局c.addItem(Item1);c.addItem(Item2);c.addItem(Item3);add(c);c.setBounds(80,80,100,20);add(b1);b1.setBounds(20,20,50,30);add(b2);b2.setBounds(100,20,50,30);add(b3);b3.setBounds(200,60,50,50);图图8.13该该程程序序先先通通过过setLayout(null)语语句句关关闭闭了了默默认认的的布布局局管理器。管理器。然后使用然后使用setBounds方法设置组件的摆放位置和大小。方法设置组件的摆放位置和大小。setBounds方法有方法有4个参数,个参数,x和和y指定了组件的水平指定了组件的水平和纵向位置坐标;和纵向位置坐标;width指定了组件的宽度;指定了组件的宽度;height指定了组件的高度。例如指定了组件的高度。例如b2.setBounds(100,20,50,30)将按钮将按钮b2放在(放在(120,20)位置,宽度和高度分别是)位置,宽度和高度分别是50和和30。在在Java中中,程程序序和和用用户户的的交交互互是是通通过过响响应应各各种种事事件件来来实实现现的的。每每当当一一个个事事件件发发生生,Java虚虚拟拟机机就就会会将将事事件件的的消消息息传传递递给给程程序序,由由程程序序中中的的事事件件处处理理方方法法对对事事件件进行处理。进行处理。如果希望能对各种事件作出反应,要编写一个或多个如果希望能对各种事件作出反应,要编写一个或多个事件处理方法,当程序监听到事件发生后,就可以调事件处理方法,当程序监听到事件发生后,就可以调用事件处理方法来处理了。用事件处理方法来处理了。Java通过委托型事件处理通过委托型事件处理机制解决如何对事件作出响应的问题。机制解决如何对事件作出响应的问题。8.3事件处理方法事件处理方法8.3.1事件与事件处理方法事件与事件处理方法能能产产生生事事件件的的组组件件叫叫做做事事件件源源,如如按按钮钮。如如果果希希望望对对单单击击按按钮钮事事件件进进行行处处理理,可可给给事事件件源源(按按钮钮)注注册册一一个个事事件件监监听听器器(如如包包含含按按钮钮的的容容器器),如如同同签签订订了了一一个个委委托托合合同同,当当事事件件源源发发生生事事件件时时,事事件件监监听听器器就就代代替替事事件件源源对对发发生生的的事事件件进进行行处处理理,这这就就是是所所谓谓的的委委托托事件处理机制。事件处理机制。事事件件监监听听器器可可以以是是一一个个自自定定义义类类或或其其他他容容器器,如如定定义义的的类类S1、Applet、Canvas、Frame等等,它它们们本本身身并并没没有有事事件件处处理理方方法法,所所以以需需要要使使用用事事件件接接口口中中的的事事件件处处理理方方法法来来创创建建事事件件处处理理方方法法。因因此此,事事件件监监听听器器必必须须实现事件接口的方法。实现事件接口的方法。8.3.2Java的事件处理机制的事件处理机制注注意意,这这里里的的事事件件监监听听器器不不一一定定是是包包容容事事件件源源的的容容器器对对象象,只只要要一一个个对对象象实实现现了了事事件件监监听听器器接接口口就就能能成成为为事事件件监监听听器器。这这样样处处理理可可使使程程序序中中的的事事件件处处理理代代码码与与GUI代码分离,有利于优化程序结构。代码分离,有利于优化程序结构。事事件件接接口口定定义义了了抽抽象象方方法法来来统统一一处处理理某某一一类类事事件件,事事件件监监听听器器可可以以覆覆盖盖这这些些处处理理方方法法以以作作出出响响应应。不不同同类类型型的的事事件件必必须须由由不不同同的的事事件件接接口口处处理理,因因此此,一一个个事事件件监监听听器器如如果果要要处处理理多多种种事事件件,就就必必须须实实现现多多个个事事件件接接口口。当当事事件件源源的的事事件件被被触触发发后后,系系统统将将这这个个事事件件作作为为参参数数传传递递给给事事件件监监听听器器的的事事件件处处理理方方法法以以响响应应处处理理操作。操作。Java将所有组件可能发生的事件进行了分类,具有共将所有组件可能发生的事件进行了分类,具有共同特征的事件被抽象为一个事件类同特征的事件被抽象为一个事件类AWTEvent,其中其中包括包括ActionEvent单击事件类、单击事件类、MouseEvent鼠标事件鼠标事件类等,它们不是某个具体组件如按钮或选项框的事件,类等,它们不是某个具体组件如按钮或选项框的事件,而是属于所有组件,只要该组件能产生这种事件。这而是属于所有组件,只要该组件能产生这种事件。这种处理方式使种处理方式使Java加强了对事件的管理,提高了代码加强了对事件的管理,提高了代码的重用性。的重用性。1.单击按钮事件处理单击按钮事件处理例例8.14本本程程序序在在Applet上上创创建建两两个个面面板板,分分别别在在面面板板上上创创建建了了一一个个按按钮钮和和一一个个标标签签。用用鼠鼠标标单单击击按按钮钮时时,会听到一声响声,参见图会听到一声响声,参见图8.14。图图8.148.3.3事件处理实例事件处理实例importjava.awt.*;importjava.awt.event.*;importjava.applet.Applet;publicclassBeepextendsAppletimplementsActionListener/实实现现动动作作事事件件监监听听接口接口publicvoidinit()add(newLabel(按一下按钮可听到响声!按一下按钮可听到响声!,Label.CENTER);Buttonbtn=newButton(按钮按钮);add(btn);btn.addActionListener(this);/注册事件源的动作监听者注册事件源的动作监听者publicvoidactionPerformed(ActionEvente)Toolkit.getDefaultToolkit().beep();/动作事件发生时要作出的反应动作事件发生时要作出的反应从本例中可以概括出事件处理的步骤:从本例中可以概括出事件处理的步骤:(1)引引 入入 系系 统统 事事 件件 类类 包包。如如 import java.awt.event.*。(2)在在定定义义类类的的同同时时声声明明实实现现单单击击事事件件监监听听器器接接口口。如如implementsActionListener。(3)在在 方方 法法 中中 调调 用用 事事 件件 源源 对对 象象 的的 addActionListener注注册册事事件件监监听听器器方方法法,给给事事件件源源对对象象注注册册事事件件监监听听器器。如如btn.addActionListener(this),这这里里this为当前类为当前类Beep。(4)实现实现actionPerformed事件接口方法。事件接口方法。ActionListener接口中的方法一定要实现,即编写事接口中的方法一定要实现,即编写事件处理代码以响应事件的发生。当单击按钮时,系统件处理代码以响应事件的发生。当单击按钮时,系统将产生将产生ActionEvent事件,动作事件监听器就调用事件,动作事件监听器就调用actionPerformed方法处理这个事件。方法处理这个事件。2.选项事件处理选项事件处理例例8.15处处理理复复选选框框和和选选项项按按钮钮事事件件,结结果果如如图图8.15所所示。示。图图8.15importjava.applet.Applet;importjava.awt.*;importjava.awt.event.*;publicclassItemDemoextendsAppletimplementsItemListenerTextAreaarea=newTextArea(6,30);StringCity=北京北京,