图形用户界面的设计与实现.ppt

上传人:max****ui 文档编号:12720376 上传时间:2020-05-19 格式:PPT 页数:258 大小:2.57MB
返回 下载 相关 举报
图形用户界面的设计与实现.ppt_第1页
第1页 / 共258页
图形用户界面的设计与实现.ppt_第2页
第2页 / 共258页
图形用户界面的设计与实现.ppt_第3页
第3页 / 共258页
点击查看更多>>
资源描述
第7章图形用户界面的设计与实现,7.1图形用户界面概述7.2用户自定义成分7.3Java的事件处理7.4GUI标准组件概述7.5标签、按钮与动作事件7.6文本框、文本区域与文本事件,7.7单、复选按钮,列表与选择事件7.8滚动条与调整事件7.9画布与鼠标、键盘事件7.10布局设计7.11Panel与容器事件7.12Frame与窗口事件7.13菜单的定义与使用7.14对话框、组件事件与焦点事件,在Java语言中,为了支持图形用户界面的开发,设计了类库java.awt包来生成各种标准图形界面元素和处理图形界面的各种事件。AWT是abstractwindowtoolkit(抽象窗口工具集)的缩写。,7.1图形用户界面概述,图形用户界面的构成:图形用户界面是一组图形界面成分和界面元素的有机组合,这些成分和元素之间不但外观上有着包含、相邻、相交等物理关系,内在的也有包含、调用等逻辑关系,它们互相作用、传递消息,共同组成一个能响应特定事件、具有一定功能的图形界面系统。,设计和实现图形用户界面的工作主要两个:创建组成界面的各元素,指定它们的属性和位置关系,构成完整的图形用户界面的外观。定义图形用户界面的事件和各界面元素对不同事件的响应,实现与用户的交互。Java中构成图形用户界面的各种元素和成分有三类:容器、控制组件和用户自定义成分。,1.容器容器是用来组织其他界面成分和元素的单元。一个应用程序的图形用户界面首先对应于一个复杂的容器,如一个窗口。利用容器有利于分解图形用户界面的复杂性,当界面的功能较多时,可以使用嵌套的容器。,2.控制组件控制组件是图形用户界面的最小单位之一,它里面不再包含其他的成分。控制组件的作用是完成与用户的一次交互,包括接收用户的一个命令(如菜单命令),接收用户的一个文本或选择输入,向用户显示一段文本或一个图形,等等。,使用控制组件的步骤:(1)创建某控件类对象,指定属性。(2)使用某种布局,将该控件对象加入到某容器中的指定位置。(3)将该组件对象注册给它所能产生的事件对应的事件监听者,重载事件处理方法,实现利用该组件对象与用户交互的功能。实际上,容器也是一种控件,因为一个容器也可以被视为组件而包含在其他容器的内部。,3.用户自定义成分绘制几何图形、使用标志图案等。用户自定义成分不能被系统识别和承认,通常只能起到装饰、美化的作用,而不能响应用户的动作,也不具有交互功能。,Graphics是java.awt包中一个类,包含绘制图形和文字的方法。当一个Applet运行时,执行它的浏览器自动为它创建一个Graphics实例,利用这个实例,可在Applet中随意绘制图形和文字。若需在图形界面的JavaApplication程序中绘制图形,则需创建一个Canvas类的对象加入到该Application程序的图形界面容器中,Canvas对象也有一个与Applet类的paint()方法相同的paint()方法,利用系统传递给这个paint()方法的Graphics类参数对象就可以在Application程序的图形用户界面中绘制各种图形和文字。,7.2用户自定义成分,7.2.1绘制图形利用Graphics类可绘制的图形有直线、各种矩形、多边形、圆和椭圆等。例7-1UsedDrawFigures.java,importjava.awt.*;importjava.applet.Applet;publicclassUsedDrawFiguresextendsAppletpublicvoidpaint(Graphicsg)g.drawLine(30,5,40,5);/画直线g.drawRect(40,10,50,20);/画矩形框(左上角x坐标,左上角y坐标,x轴尺寸,y轴尺寸)g.fillRect(60,30,70,40);/画实心矩形g.drawRoundRect(110,10,130,50,30,30);/画圆角矩形框g.drawOval(150,120,70,40);/画椭圆形框(左上角x坐标,左上角y坐标,x轴尺寸,y轴尺寸),/若x轴尺寸与y轴尺寸相等,则画出圆形,g.fillOval(190,160,70,40);/画实心椭圆g.drawOval(90,100,50,40);/画椭圆框g.fillOval(130,100,50,40);/画实心椭圆drawMyPolygon(g);/自定义的画多边形的方法g.drawString(Theyarefigures!,100,220);publicvoiddrawMyPolygon(Graphicsg)intxCoords=30,50,65,119,127;/保存多边形各点x坐标的数组intyCoords=100,140,127,169,201;/保存多边形各点y坐标的数组g.drawPolygon(xCoords,yCoords,5);/画自由多边形框,7.2.2显示文字Graphics类的方法drawString()可在屏幕的指定位置显示一个字符串。Font类,可获得更丰富多彩和逼真精确的字体显示效果。一个Font类的对象表示了一种字体显示效果,包括字体、字型和字号。例如:FontMyFont=newFont(“TimesRoman”,Font.BOLD,12);MyFont对应的是12磅TimesRoman类型的黑体字,其中指定字型时需要用到Font类的三个常量:Font.PLAIN,Font.BOLD,Font.ITALIC。,若需使用该Font对象,可利用Graphics类的setFont()方法:g.setFont(MyFont);若指定控件的字体效果,如按钮或文本框等,可使用控件的方法setFont()。设btn是按钮对象,则语句:btn.setFont(MyFont);把该按钮上显示的字体改为12磅的TimesRoman黑体字。getFont()方法将返回当前Graphics或组件对象使用的字体。,例7-2AvailableFonts.java,importjava.applet.*;importjava.awt.*;publicclassAvailableFontextendsAppletGraphicsEnvironmentgl=GraphicsEnvironment.getLocalGraphicsEnvironment();StringFontNames=gl.getAvailableFontFamilyNames();publicvoidpaint(Graphicsg)Fontcurrent,oldFont;oldFont=g.getFont();for(inti=0;iFontNames.length;i+)current=newFont(FontNamesi,Font.PLAIN,10);g.setFont(current);g.drawString(current.getName(),10+i%4*120,20+i/4*15);g.setFont(oldFont);,7.2.3控制颜色Applet中显示的字符串或图形的颜色可以用Color类的对象来控制,每个Color对象代表一种颜色,用户可以直接使用Color类中定义好的颜色常量,也可通过调配红、绿、蓝三色的比例创建自己的Color对象。,Color类定义了三种构造函数:publicColor(intRed,intGreen,intBlue);/整型参数指定R,G,B的取值范围在0255之间publicColor(floatRed,floatGreen,floatBlue);/浮点参数R,G,B的取值范围在0.01.0之间publicColor(intRGB);/整型参数指明RGB三色比例,这个参数的07比特(取值范围为0255)代表红色的比例,815比特代表绿色的比例,1623比特代表蓝色的比例例:创建蓝色:ColorblueColor=newColor(0,0,255);,Graphics对象的setColor():把当前的缺省颜色修改成新建的颜色,此后调用该Graphics对象完成的绘制工作,如绘制图形、字符串等,都使用这个新建颜色:g.setColor(blueColor);除了创建自己的颜色,也可以直接使用Color类中定义好的颜色常量,如:g.setColor(Color.cyan);Color类中共定义了13种静态颜色常量,包括black,orange,pink,grey等,使用时只需以Color为前缀。,对于GUI的控制组件,它们有四个与颜色有关的方法分别用来设置和获取组件的背景色和前景色:publicvoidsetBackground(Colorc)publicColorgetBackground()publicvoidsetForeground()publicColorgetForeground(),importjava.applet.*;importjava.awt.*;publicclassMyUseColorextendsAppletColoroldColor;StringParamName=red,green,blue;/三个HTML参数的名称intRGBarray=newint3;/保存三色比例的数组publicvoidinit()for(inti=0;iParamName.length;i+)/取得HTML文件指定的三色RGBarrayi=Integer.parseInt(getParameter(ParamNamei);publicvoidpaint(Graphicsg)oldColor=g.getColor();/保存原有的缺省颜色g.setColor(newColor(RGBarray0,RGBarray1,RGBarray2);/置新颜色g.drawString(HowdoyouthinkaboutCurrentcolor:+g.getColor().toString(),10,20);/用新建颜色显示该颜色的三色分量g.setColor(oldColor);/恢复原有颜色g.drawString(Backtoolddefaultcolor:+g.getColor().toString(),10,40);,例7-3UseColor.java,HTML文件如下:UseColor通过改变三个参数的数值(应在0255之间),就可以指定不同的颜色而不需要重新编译JavaApplet程序。,7.2.4显示图像图像文件有多种格式,如bmp文件、gif文件、tiff文件等等,其中gif是Internet上常用的图像文件格式。Java中可以利用Graphics类的drawImage()方法来显示图像。,importjava.awt.*;importjava.applet.Applet;publicclassUsedDrawMyImageextendsAppletImagemyImage;publicvoidinit()myImage=getImage(getDocumentBase(),Winter.gif);publicvoidpaint(Graphicsg)g.drawImage(myImage,0,0,this);/显示图像,例7-4UsedDrawMyImage.java,drawImage()是Graphics类中用来显示图像的方法。第一个参数保存有图像数据的Image对象。第二、第三个参数是图像的左上角点坐标,它们决定了图像在容器中的显示位置。最后一个参数是显示图像的容器对象。this代表当前的Applet对象。,获取、显示本机其它位置处的图像:ImagemyImage=getToolkit().getImage(“E:新建相册IMG_0207.jpg”);或:ImagemyImage=Toolkit.getDefaultToolkit().getImage(E:新建相册IMG_0207.jpg);显示来自网上的某张图片:myImage=this.getToolkit().getImage(newURL(,7.2.5实现动画效果动画是JavaApplet最吸引人的特性之一。用Java实现动画的原理与放映动画片类似,取若干相关的图像或图片,顺序、连续地在屏幕上先显示,后擦除,循环往复就可以获得动画的效果。,例7-5MyShowAnimator.java,importjava.applet.Applet;importjava.awt.*;publicclassMyShowAnimatorextendsAppletintx=10;Imagem_Images;/保存图片序列的Image数组inttotalImages=5;/图片序列中的图片总数intcurrentImage=0;/当前时刻应显示的图片序号publicvoidinit()m_Images=newImagetotalImages;/从当前目录下的images子目录中将Img001.gif到Img0010.gif的文件加载for(inti=0;itotalImages;i+)m_Imagesi=getImage(getDocumentBase(),imageswinter00+(i+1)+.gif);publicvoidstart()currentImage=0;/从第一幅开始显示,publicvoidpaint(Graphicsg)g.drawImage(m_ImagescurrentImage,x,50,this);/显示当前序号的图片x+=20;currentImage=+currentImage%totalImages;/计算下一个应显示图片的序号tryThread.sleep(200);/程序休眠50毫秒catch(InterruptedExceptione)/处理执行休眠方法可能引发的异常showStatus(e.toString();repaint();/图片停留50毫秒后被擦除,重新调用paint()显示下一张图片,Thread.sleep():使当前的程序线程休眠一段时间,以便每幅图片在下一幅图片显示之前在屏幕上逗留一时间,线程的具体编程将在以后章节介绍。getImage()方法获取所有的.gif图像文件(注意目录)。paint()方法一次显示一幅图像,稍后再显示Image对象数组中的下一幅图像。,图形用户界面事件响应的基本原理:键盘或鼠标操作能引发系统预先定义好的事件,用户程序只需要编制代码定义每个特定事件发生时程序应做出何种响应即可。这些代码会在它们对应的事件发生时由系统自动调用。Java中,除了键盘和鼠标操作,系统的状态改变、标准图形界面元素等都可以引发事件,对这些事件分别定义处理代码,就可保证应用程序在不同状况下都合理有效、有条不紊地正常工作。Java的事件处理机制中引入了委托事件模型(如下图),不同的事件由不同的监听者处理。,7.3Java的事件处理,委托事件模型,图形用户界面的每个可能产生事件的组件叫事件源,不同事件源上发生的事件的种类不同。如,Button对象或MenuItem对象等作为事件源可能引发ActionEvent类代表的事件ACTION-PERFORMED;Checkbox对象等作为事件源可能引发ItemEvent类代表的事件ITEM-STATE-CHANGES。,希望事件源上发生的事件被程序处理,应把事件源注册给能够处理该事件源上那种类型事件的监听者。例如Button对象把自己注册给实现了ActionListener接口的对象,因为只有这种对象能够处理Button对象上发生的ActionEvent类的事件,监听者可以是包容事件源的容器,也可为另外的对象。注册方法是通过调用事件源本身的相关方法,例如调用Button类自身的addActionListener()方法,并以监听者对象作为实际参数来实现的。,监听者具有监听和处理某类事件的功能,因为它实现了有关的接口,所以监听者需要对它所实现接口的所有抽象方法写出具体的方法体,对应事件源上发生的事件的处理代码就写在这些方法体中。例如对Button上发生的事件的处理代码就是写在Button对象所注册的监听者的actionPerformed()方法中,这个方法是对ActionListener接口中同名抽象方法的具体实现。,当事件源上发生监听者可以处理的事件时,事件源把这个事件作为实际参数传递给监听者中负责处理这类事件的方法(委托),该方法被系统自动执行后,事件就得到了处理。监听者不一定是包容事件源的容器对象,这使程序中的事件处理代码与GUI界面构成代码可以分离,利于优化程序结构;另外,由于Java对事件作了详细的分类并委托不同的接口方法来处理,这也提高了的代码性能。,AWTEvent类体系结构图,Java的所有事件类和处理事件的监听者接口都定义在java.awt.event包中,事件类的层次结构如右图。,上图中包括的事件类基本都是java.awt.AWTEvent类的子类,而java.awt.AWTEvent类则是java.util.EventObject类的子类。EventObject的一个重要方法是getSource(),该方法返回产生事件的事件源,几乎所有的事件类都要用到该方法。注意:并非每个事件类都只对应一个事件,例如KeyEvent类可能对应KEY-PRESSED(键按下)、KEY-RELEASED(键松开)、KEY-TYPED(击键)三个具体的事件。,判断一个KeyEvent类的对象到底代表哪种事件,可以调用它的getID()方法并把方法的返回值与KEY-PRESSED等几个常量相比较。每个事件类的对象都拥有getID()方法,是它们从共同的父类AWTEvent那里继承来的。,7.4GUI标准组件概述构建程序的图形用户界面的主要任务有两个:一、创建各界面组件并排列成图形用户界面的物理外观;二、定义组件对不同事件的响应、完成图形用户界面功能。,AWT组件层次关系图,基本控件被安放在容器中的某个位置,用来完成用户交互的功能。使用基本控件的步骤如下:(1)创建某基本控件类的对象,指定其属性,如外观、大小等。(2)将该对象加入到某个容器的合适位置。(3)创建该组件对象的监听者,即实现以该组件为事件源的事件对应的监听者接口,也可以使现有的类实现该接口成为监听者。将该组件对象注册给此监听者,并在监听者内部实现监听者接口中定义的方法,对该组件可能引发的事件加以处理,定义新加入的组件对象的交互性界面功能,如接收用户输入的文本或选择、做屏幕显示输出等。,Component类是所有组件和容器的抽象父类,它定义了每个容器和组件都可能用到的方法,常用的有:(1)publicvoidadd(PopupMenupopup):在组件上加入一个弹出菜单,当用户用鼠标右键单击组件时将弹出该菜单。(2)publicColorgetBackground():获得组件的背景色。(3)publicFontgetFont():获得组件使用的字体。(4)publicColorgetForeground():获得组件的前景色。,(5)publicGraphicsgetGraphics():获得在组件上绘图时需要使用的Graphics对象。(6)publicvoidrepaint(intx,inty,intwidth,intheight):以指定的坐标点(x,y)为左上角,重画组件中指定宽度(width)、指定高度(height)的区域。(7)publicvoidsetBackground(Colorc):设置组件的背景色。(8)publicvoidsetEnabled(booleanb):设置组件的使能状态。参数b为真则组件使能,否则组件不使能。只有使能状态的组件才能接受用户输入并引发事件。,(9)publicvoidsetFont(Fontf):设置组件使用的字体。(10)publicvoidsetSize(intwidth,intheight):设置组件的大小。(11)publicvoidsetVisible(booleanb):设置组件是否可见的属性。参数b为真时,组件在包括它的容器可见时也可见;否则组件不可见。(12)publicvoidsetForeground(Colorc):设置组件的前景色。(13)publicvoidrequestFocus():使组件获得注意的焦点。下面从创建、常用方法和事件响应几个方面来讨论常用的GUI组件和容器。,7.5标签、按钮与动作事件1.标签(Label)标签是用户只能查看其内容的文本显示区域,每个标签用一个Label类的对象表示。(1)创建标签创建标签对象时应同时说明这个标签中的字符串:Labelprompt=newLabel(请输入一个整数:);(2)常用方法,若需修改标签的文本,可以使用Label对象的方法setText(新字符串);对于一个未知标签,可通过调用Label对象的getText()方法来获得它的文本内容。如下所示:if(prompt.getText()=你好)prompt.setText(再见);elseif(prompt.getText()=再见)prompt.setText(你好);(3)产生事件标签不能接受用户的输入,所以不能引发事件。它不是事件源。,2.按钮(Button)按钮一般对应一个事先定义好的功能操作,并对应一段程序。当用户点击按钮时,系统自动执行与该按钮相联系的程序,从而完成预先指定的功能。(1)创建创建一个按钮,传递给构造函数的字符串参数指明按钮上的标签:Buttonenter=newButton(操作);(2)常用方法,getLabel():返回按钮标签字符串;setLabel(Strings):把按钮的标签设置为字符串s。(3)产生事件按钮可以引发动作事件,当用户单击一个按钮时就引发一个动作事件,希望响应按钮引发的动作事件的程序须把按钮注册给实现了ActionListener接口的动作事件监听者,并为这个接口的actionPerformed(ActionEvente)方法书写方法体。在方法体中,可调用e.getSource()获取引发动作事件的按钮对象引用,或调用e.getActionCommand()获取按钮的标签或事先为这个按钮设置的命令名。,importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassUsedBtnLabelActionextendsAppletimplementsActionListenerLabelprompt;Buttonbtn;publicvoidinit()prompt=newLabel(你好);btn=newButton(操作);add(prompt);add(btn);btn.addActionListener(this);publicvoidactionPerformed(ActionEvente)if(e.getSource()=btn)if(prompt.getText()=你好)prompt.setText(再见);elseprompt.setText(你好);,例7-6UsedBtnLabelAction.java,运行结果,3.动作事件(ActionEvent)ActionEvent类只包含一个事件,即执行动作事件ACTION-PERFORMED。ACTION-PERFORMED是引发某个动作执行的事件。能触发该事件的动作有以下四类:(1)点击按钮;(2)双击一个列表中的选项;(3)选择菜单项;(4)在文本框中输入回车。,ActionEvent类的重要方法有:(1)publicStringgetActionCommand()该方法返回引发事件的动作的命令名,该命令名可通过调用setActionCommand()指定给事件源组件,也可使用事件源的缺省命令名。例如一个按钮组件m-Button是ACTION-PERFORMED事件的事件源,如下语句将这个按钮对象的动作命令名设为“命令名”并将它注册给当前的监听者:Buttonm-Button=newButton(按钮标签);m-Button.setActionCommand(命令名);m-Button.addActionListener(this);,动作事件的监听者需要实现动作,监听者接口的方法为:publicvoidactionPerformed(ActionEvente)if(e.getActionCommand()=命令名),注意:setActionCommand()方法与getActionCommand()方法属于不同的类,getActionCommand()方法是ActionEvent类的方法,而setActionCommand()方法是其上发生动作事件的事件源,如按钮、菜单项等的方法。事件源对象也可以不专门调用setActionCommand()方法来指定命令名,此时getActionCommand()方法返回缺省的命令名,例如上面的程序片断如果去掉设置动作命令名的一句,则监听者接口的方法可以写为:publicvoidactionPerformed(ActionEvente)if(e.getActionCommand()=按钮标签),可见按钮的缺省命令名就是按钮的标签。使用getActionCommand()方法可以区分产生动作命令的不同事件源,使actionPerformed()方法对不同事件源引发的事件区分对待处理(区分事件的事件源也可以使用getSource()方法,但是这样一来处理事件的代码就与GUI结合得过于紧密,对于小程序尚可接受,对于大程序则不提倡)。,(2)publicintgetModifiers()如果发生动作事件的同时用户还按了Ctrl、Shift等功能键,则可以调用这个事件的getModifiers()方法来获得和区分这些功能键,实际上是把一个动作事件再细分成几个事件;把一个命令细分成几个命令。将getModifiers()方法的返回值与ActionEvent类的几个静态常量ALT-MASK,CTRL-MASK,SHIFT-MASK,META-MASK相比较,就可以判断用户按下了哪个功能键。,7.6文本框、文本区域与文本事件1.文本事件(TextEvent)TextEvent类只包含一个事件,即代表文本区域中文本变化的事件TEXT-VALUE-CHANGED,在文本区域中改变文本内容。例如,删除字符、键入字符都将引发这个事件。该事件较简单,不需特别判断事件类型的方法和常量。2.文本框与文本域(TextField与TextArea)Java中用于文本处理的基本组件有两种:单行文本框TextField和多行文本区域TextArea,它们都是TextComponent的子类。,(1)创建在创建文本组件的同时可以指出文本组件中的初始文本字符串,如下创建一个10行45列的多行文本区域:TextAreatextArea1=newTextArea(10,45);而创建能容纳8个字符,初始字符串为“卡号”的单行文本框可以使用如下的语句:TextFieldname=newTextField(卡号,8);(2)常用方法先介绍TextComponent中的常用方法,即TextField和TextArea都拥有的常用方法。,用户可以在已创建好的文本区域中自由输入和编辑文本信息,对于用户输入的信息,可以调用TextComponent的getText()方法来获得,这个方法的返回值为一个字符串。如果希望在程序中对文本区域显示的内容赋值,可以调用TextComponent的另一个方法setText()。例如下面的语句:textArea1.setText(你好,欢迎!);将文本区域的内容置为“你好,欢迎!”。,某些情况下需要将文本区域设为不能编辑的。例如,电话卡的卡号是系统自动生成的,不需要也不允许用户随意改动,这时可用如下的语句使对应电话卡卡号的文本框cardNo不可被用户通过界面改动:cardNo.setEditable(false);使用isEditable()方法判断当前的文本区域是否可以被编辑。,TextComponent中还有一些用来指定或获得文本区域中“选定状态”文本的方法,选定状态的文本一般用高亮或反白显示:select(intstart,intend)根据指定的起止位置选定一段文本;selectAll():选定文本区域中的所有文本;setSelectionStart()和setSelectionEnd()分别指定选定文本的起、止位置;getSelectionStart()和getSelectionEnd():获得已经选定文本的起、止位置;getSelectedText()获得选定文本的具体内容(字符串)。,TextField自己的方法:例如某些场合下(如输入密码时)希望文本区域中的内容不如实回显在屏幕上,可以调用如下的方法:TextFieldtf=newTextField(输入密码);tf.setEchoChar(*);此时,TextField中的每个字符(无论中西文)都被回显成一个星号*,保证看不到其中的实际字符。另外,TextField还定义了echoCharIsSet()确认当前文本框是否处于不回显状态;getEchoChar()获得当前文本框不回显的屏蔽字符。,除了继承TextComponent类的方法,TextArea定义了两个特殊的方法,如下:append(Strings)在当前文本区域已有文本的后面添加字符串参数s指定的文本内容;insert(Strings,intindex)将字符串s插入到已有文本的指定序号处。,(3)事件响应TextField和TextArea的事件响应首先由它们的父类TextComponent决定。TextComponent的事件响应如下:TextComponent可引发一种事件:当用户修改文本区域中的文本,如做文本的添加、删除、修改等操作时,将引发TextEvent对象代表的文本改变事件。在此基础上TextField还比TextArea多产生一种事件,当用户在文本框中按回车时,将引发代表动作事件的ActionEvent事件。TextArea不能产生ActionEvent事件,也没有addActionListener()方法。,若需响应上述两类事件,则需把文本框加入实现了TextListener接口的文本改变事件监听者和实现了ActionListener接口的动作事件监听者:textField1.addTextListener(this);textField1.addActionListener(this);在监听者内部分别定义响应文本改变事件和动作事件的方法:publicvoidtextValueChanged(TextEvente);publicvoidactionPerformed(ActionEvente);来响应文本框引发的文本改变事件和动作事件。,调用e.getSource()可获得引发该事件的文本框的对象引用。调用该文本框的方法,可获得改变后的文本内容:StringafterChange=(TextField)e.getSource().getText();对于动作事件,同样可通过调用e.getSource()方法获得用户输入回车的那个文本框的对象引用。,importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassUsedTextComponentEventextendsAppletimplementsTextListener,ActionListenerTextFieldtf;TextAreata;publicvoidinit()tf=newTextField(45);ta=newTextArea(10,45);add(tf);add(ta);tf.addActionListener(this);tf.addTextListener(this);publicvoidtextValueChanged(TextEvente)if(e.getSource()=tf)ta.setText(TextField)e.getSource().getText();publicvoidactionPerformed(ActionEvente)if(e.getSource()=tf)ta.setText();,例7-7UsedTextComponentEvent.java,7.7单、复选按钮,列表与选择事件1.选择事件(ItemEvent)ItemEvent类只包含代表选择项的选中状态发生变化的事件ITEM-STATE-CHANGED。引发这类事件的动作包括:(1)改变列表类List对象选项的选中或不选中状态。(2)改变下拉列表类Choice对象选项的选中或不选中。(3)改变复选按钮类Checkbox对象的选中或不选中状态。(4)改变检测盒菜单项CheckboxMenuItem对象的选中或不选中状态。,ItmeEvent类的主要方法:(1)publicItemSelectablegetItemSelectable()返回引发选中状态变化事件的事件源,例如,选项变化的List对象或选中状态变化的Checkbox对象,这些能引发选中状态变化事件的都是实现了ItemSelectable接口的类的对象,包括List对象、Choice对象、Checkbox对象等。getItemSelectable()返回这些类的对象引用。,(2)publicObjectgetItem()返回引发选中状态变化事件的具体选择项,如选中Choice的具体item,通过调用这个方法可知用户选中了哪个选项。(3)publicintgetStateChange()返回具体的选中状态变化类型,它的返回值在ItemEvent类的几个静态常量列举的集合之内:ItemEvent.SELECTED:代表选项被选中。ItemEvent.DESELECTED:代表选项被放弃不选。,2.复选按钮(Checkbox)(1)创建复选按钮也叫检测盒,用Checkbox类的对象表示。创建复选按钮对象时可指明其文本说明标签,该文本标签简要地说明了检测盒的意义和作用。Checkboxbackg=newCheckbox(背景色);,(2)常用方法每个复选按钮都两种状态:被选中的check状态,未被选中的uncheck状态,复选按钮都只处于这两种状态之一。查看点击选择了复选按钮,可调用Checkbox的方法getState()。若被选中,则返回true,否则返回false。调用Checkbox的另一个方法setState()可以用程序设置是否选中复选按钮。下面的语句使Checkbox处于选中状态。backg.setState(true);,(3)事件响应当用户点击检测盒使其选中状态发生变化时会引发ItemEvent类代表的选择事件。下面的语句:backg.addItemListener(this);把backg注册给ItemEvent事件的监听者ItemListener。则系统自动调用ItemListener中的方法:publicvoiditemStateChanged(ItemEvente);来响应复选按钮的状态改变。,凡是实现了ItemListener接口的监听者,例如包容复选按钮的容器,需要具体实现此方法。此方法的方法体通常包括如下语句:e.getItemSelectable():获得引发选择事件的事件源对象引用e.getState()获取选择事件之后的状态。注意:getItemSelectable()方法的返回值是实现了Selectable接口的对象,需将它强制转化成真正的事件源对象类型。例如:(Checkbox)e.getItemSelectable().getState();(Checkbox)e.getItemSelectable().setState(false);,例7-8UsedTestCheckbox.java,importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassUsedTestCheckboxextendsAppletimplementsItemListenerCheckboxckb;Buttonbtn;publicvoidinit()ckb=newCheckbox(背景色);btn=newButton(效果);add(ckb);add(btn);ckb.addItemListener(this);publicvoiditemStateChanged(ItemEvente)Checkboxtemp;if(e.getItemSelectable()instanceofCheckbox)temp=(Checkbox)(e.getItemSelectable();if(temp.getLabel()=背景色)if(temp.getState()btn.setBackground(Color.cyan);elsebtn.setBackground(Color.gray);,3.单选按钮组(CheckboxGroup)(1)创建Checkbox提供“二选一”的机制。若实现“多选一”,可用单选按钮组。单选按钮组是一组Checkbox的集合,用CheckboxGroup类的对象表示。每个Checkbox对应一种可能的取值情况。例:如下创建的单选按钮组代表了三种字体风格。style=newCheckboxGroup();p=newCheckbox(普通,true,style);b=newCheckbox(黑体,false,style);i=newCheckbox(斜体,false,style);,把CheckboxGroup加入容器时需把每个单选按钮逐个加入到容器中,而不能使用CheckboxGroup对象一次性地加入。加入上面的单选按钮需引用如下的语句:add(p);add(b);add(i);,(2)常用方法单选按钮的选择是互斥的。调用CheckboxGroup的getSelectedCheckbox():获取选择了哪个按钮,并返回用户选中的Checkbox对象,再调用该对象的方法getLabel()可知用户选择了什么信息。CheckboxGroup的setSelectedCheckbox()用于指定单选按钮组中的某个按钮。例如,下面的语句说明字体的风格为斜体。sex.setSelectedCheckbox(i);,另外,也可直接使用按钮组中的Checkbox单选按钮的方法。直接调用i.getState();可知这个按钮是否被选中。如果该按钮被选中,则其他按钮一定处于未选中状态。单选按钮组中可包括两个或更多的单选按钮。(3)事件响应CheckboxGroup类不是java.awt.*包中的类,它是Object的直接子类,所以按钮组不能响应事件,但按钮组中的每个按钮可以响应ItemEvent类的事件。单选按钮组中的每个单选按钮都是Checkbox对象,它们对事件的响应与检测盒对事件的响应相同。,例7-9UsedCheckboxgroup.java,importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassUsedCheckboxgroupextendsAppletimplementsItemListenerCheckboxGroupstyle;Checkboxp,b,i;Buttonbtn;publicvoidinit()style=newCheckboxGroup();p=newCheckbox(普通,true,style);b=newCheckbox(黑体,false,style);i=newCheckbox(斜体,false,style);btn=newButton(效果);add(p);add(b);add(i);add(btn);p.addItemListener(this);b.addItemListener(this);i.addItemListener(this);,publicvoiditemStateChanged(ItemEvente)Checkboxtemp;FontoldF=btn.getFont();if(e.getItemSelectable()instanceofCheckbox)temp=(Checkbox)(e.getItemSelectable();if(temp.getLabel()=普通)btn.setFont(newFont(oldF.getName(),Font.PLAIN,oldF.getSize();if(temp.getLabel()=黑体)btn.setFont(newFont(oldF.getName(),Font.BOLD,oldF.getSize();if(temp.getLabel()=斜体)btn.setFont(newFont(oldF.getName(),Font.ITALIC,oldF.getSize();,4.Choice(下拉列表)(1)创建下拉列表是“多选一”的输入界面。与单选按钮组利用单选按钮把所有选项列出的方法不同,下拉列表的所有选项被折叠收藏起来,只显示最前面的或被用户选中的一个。若需看到其他的选项,则需单击下拉列表右边的下三角按钮来“下拉”出罗列了所有选项的长方形区域。创建下拉列表包括创建和添加选项两个步骤。Choicesize=newChoice();/创建下拉列表size.add(10);/为下拉列表加入选项size.add(14);size.add(18);,(2)常用方法下拉列表的常用方法有:获得选中选项、设置选中选项、添加和去除下拉列表选项的方法。,getSelectedIndex()返回被选中的选项的序号(下拉列表中第一个选项的序号为0,第二个选项的序号为1,)。getSelectedItem()返回被选中选项的标签文本字符串。,select(intindex)和select(Stringitem)方法使程序选中指定序号或文本内容的选项。add(Stringitem)和insert(Stringitem,intindex)方法分别将新选项item加在当前下拉列表的最后或指定的序号处。remove(intindex)和remove(Stringitem)方法把指定序号或指定标签文本的选项从下拉列表中删除。removeAll()方法将把下拉列表中的所有选项删除。,(3)事件响应下拉列表可产生ItemEvent代表的选择事件。如果把选项注册给实现了接口ItemListener的监听者:size.addItemListener();则当用户单击下拉列表的某个选项做出选择时,系统自动产生一个ItemEvent类的对象包含这个事件的有关信息,并把该对象作为实际参数传递给被自动调用的监听者的选择事件响应方法。publicvoiditemStateChanged(ItemEvente);,在这个方法里,调用e.getItemSelectable()可获得引发当前选择事件的下拉列表事件源,再调用此下拉列表的有关方法,可知用户具体选择了哪个选项。StringselectedItem=(Choice)e.getItemSelectable().getSelectedItem();这里需将e.getItemSelectable()方法的返回值强制类型转换成Choice类的对象引用后方可调用Choice类的方法。,UsedChoice.java,importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassUsedChoiceextendsAppletimplementsItemListenerChoicesize;Buttonbtn;publicvoidinit()size=newChoice();size.add(10);size.add(14);size.add(18);add(size);btn=newButton(效果);add(btn);size.addItemListener(this);publicvoiditemStateChanged(ItemEvente)Choicetemp;FontoldF;Strings;intsi;if(e.getItemSelectable()instanceofChoice)oldF=btn.getFont();temp=(Choice)(e.getItemSelectable();s=temp.getSelectedItem();si=Integer.parseInt(s);btn.setFont(newFont(oldF.getName(),oldF.getStyle(),si);,5.List(列表)(1)创建列表也是列出一系列的选择项供用户选择,但是列表可以实现“多选多”,即允许复选。在创建列表时,也应将它的各选项(Item)加入到列表中,语句如下:MyList=newList(4,true);MyList.add(北京);MyList.add(上海);创建一个包括两个地址选项的列表,List的构造函数的第一个参数说明列表的高度,可以一次同时显示几个选项,第二个参数表明列表是否允许复选。,(2)常用方法若想获知选择了列表的哪个选项,可调用List对象的getSelectedItem(),该方法返回选中的选择项文本。与单选按钮不同,列表中可以有复选和多选,故List对象还有一个方法getSelectedItems(),该方法返回String类型的数组,其中的每个元素是一个被用户选中的选择项,所有的元素包括了所有被用户选中的选项。,除了可直接返回被选中的选项的标签字符串外,还可获得被选中选项的序号。在List里面,第一个加入List的选项的序号是0,第二个是1,依此类推。getSelectedIndex()方法将返回被选中的选项的序号,getSelectedIndexs()方法将返回由所有被选中的选项的序号组成的整型数组。,select(intindex)和deselect(intindex)方法可以使指定序号处的选项被选中或不选中;add(Stringitem)方法和add(Stringitem,intindex)方法分别将标签为item的选项加入列表的最后面或加入列表的指定序号处;remove(Stringitem)方法和remove(intindex)方法与之相反,将拥有指定标签的选项或指定序号处的选项从列表中移出。这两个方法使程序可以动态调整列表所包含的选择项。,(3)事件响应列表可产生两种事件:单击列表中的某个选项并选中它时,产生ItemEvent类的选择事件;双击列表中的某个选项时,产生ActionEvent类的动作事件。若需对这两种事件都做出响应,需要把列表分别注册给ItemEvent的监
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!