Java语言程序设计案例教程-第8章ppt课件_第1页
Java语言程序设计案例教程-第8章ppt课件_第2页
Java语言程序设计案例教程-第8章ppt课件_第3页
Java语言程序设计案例教程-第8章ppt课件_第4页
Java语言程序设计案例教程-第8章ppt课件_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,1,第8章图形用户界面的设计与实现,本章介绍Java基本的图形编程知识,包括窗口的显示、文字和图像的显示、事件处理以及图形用户界面中常用的组件等内容。本章要点8.1Java图形用户界面概述8.2标准组件8.3简单图形用户界面8.4Java事件处理8.5布局管理8.6常用标准组件8.7Swing组件思考与练习8,.,2,8.1Java图形用户界面概述,图形用户界面(GraphicsUserInterface),简称GUI。使用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。Java1.0中出现了用来生成图形用户界面的包是java.awt,简称抽象窗口工具集,即AWT(AbstractWindowToolkit)。它的设计目标是希望构建一个通用的GUI,使得利用它编写的程序能够运行在所有的平台上,以实现Sun公司提出的口号“一次编写,随处运行”。在Java1.2中,Sun公司推出了新的用户界面库:Swing。相对AWT来说,Swing功能更强大、使用更方便,它的出现使得Java的图形用户界面上了一个台阶。但是,Swing并没有代替AWT。在Java1.1中,AWT事件处理模型有了根本改变。Swing使用的仍然是Java1.1的事件处理模型。java.awt包中提供了GUI设计所使用的类和接口,如图8-1中显示了到主要类之间的关系。,.,3,8.1Java图形用户界面概述,图8-1awt包中主要类之间的关系,.,4,8.1Java图形用户界面概述,Java中设计和实现图形用户界面的工作主要有:1.创建组件(Component):创建组成界面的各种元素,如按钮、文本框等。2.指定布局(Layout):根据具体需要排列组件的位置关系。3.响应事件(Event):定义图形用户界面的事件和各界面元素对不同事件的响应,从而实现图形用户界面与用户的交互功能。Java中构成用户界面的各种元素和成分可以分为三类:容器、控制组件和用户自定义成分。1.容器容器是用来组织其他界面成份和元素的单元。一般说来,一个应用程序的图形用户界面首先对应于一个复杂的容器,如一个窗口。这个容器内部将包含许多界面成份和元素,这些界面元素本身又可以是一个容器,这个容器将再进一步包含它的界面成份和元素,依次类推就构成一个复杂的图形界面系统。,.,5,8.1Java图形用户界面概述,容器的主要作用和特点有:(1)容器有一定的范围。一般容器都是矩形的,容器范围边界可以用边框框出来,有些则没有可见的标记。(2)容器有一定的位置。这个位置可以是屏幕四角的绝对位置,也可以是相对于其他容器边框的相对位置。(3)容器通常都有一个背景,这个背景覆盖全部容器,可以透明,也可以指定一幅特殊的图案,使界面生动化和个性化。(4)容器中可以包含其他的许多界面成份和元素。当容器被打开显示时,它上面的成份和元素也同时显示出来;当容器被关闭和隐藏时,它所包含的成份和元素也一起被隐藏。(5)容器可以按一定的规则来安排它所包含的元素,如这些元素的相对位置关系、它们的前后排列关系等。(6)容器可能被包含在其他容器之中。,.,6,8.1Java图形用户界面概述,2.控制组件与容器不同,控制组件是图形用户界面的最小单位之一,它里面不再包含其他的元素。控制组件的作用是完成与用户的一次交互,包括接受用户的一个命令,接受用户的一个文本输入,向用户显示一段文本或一个图形等。从某种程度上来说,控制组件是图形用户界面标准化的结果。3.用户自定义成分除了标准的图形界面元素,编程人员还可以根据用户需要设计一些用户自定义的图形界面成份,例如绘制一些几何图形,使用标志图案等。用户自定义成份由于不能像标准界面元素一样被系统识别和承认,所以通常只能起到装饰、美化等作用,而不能响应用户的动作,不具有交互功能。,.,7,8.2标准组件,8.2.1组件分类Java的图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。AWT组件分为容器(Container)类和非容器类组件两大类。容器本身也是组件,但容器中可以包含其他组件,也可以包含其他容器。非容器类组件的种类较多,如按钮(Button)、标签(Label)、文本类组件(TextComponent)等。java.awt包中的常用组件,如图8-2和图8-3所示。,.,8,8.2标准组件,8.2.1组件分类,图8-2Component类的常用组件,.,9,8.2标准组件,8.2.1组件分类,图8-2Component类的常用组件图8-3MenuComponent类的常用组件,.,10,8.2标准组件,8.2.1组件分类,图8-3MenuComponent类的常用组件,.,11,8.2标准组件,8.2.1容器类组件容器分为两种:顶层容器和非顶层容器两大类。顶层容器是可以独立的窗口,不需要其他组件支撑。顶层容器的类是Window,Window的重要子类是Frame和Dialog。Window、Frame、Dialog和FileDialog都是一组大都含有边框,并可以移动、放大、缩小、关闭的功能较强的容器。非顶层容器,不是独立的窗口,它们必须位于窗口之内,非顶层容器包括Panel及ScrollPane等。Panel必须放在Window组件中才能显示,它为一矩形区域,在其中可摆放其他组件,可以有自己的布局管理器。Panel的重要子类是Applet类。其中,Panel和Applet的容器都是无边框的;ScrollPane是可以自动处理滚动操作的容器。容器类的特点是:容器中可以容纳其他组件,使用add()方法,可以将其他对象加入到容器中。加入到容器中后,组件的位置和尺寸由布局管理器决定。常用的Container类的方法如下:1.add(Componentcomp):将指定组件放到容器中2.remove(Componentcomp):删除指定组件3.setLayout(LayoutManagermgr):设置容器布局,.,12,8.2标准组件,8.2.2容器类组件容器分为两种:顶层容器和非顶层容器两大类。顶层容器是可以独立的窗口,不需要其他组件支撑。顶层容器的类是Window,Window的重要子类是Frame和Dialog。Window、Frame、Dialog和FileDialog都是一组大都含有边框,并可以移动、放大、缩小、关闭的功能较强的容器。非顶层容器,不是独立的窗口,它们必须位于窗口之内,非顶层容器包括Panel及ScrollPane等。Panel必须放在Window组件中才能显示,它为一矩形区域,在其中可摆放其他组件,可以有自己的布局管理器。Panel的重要子类是Applet类。其中,Panel和Applet的容器都是无边框的;ScrollPane是可以自动处理滚动操作的容器。容器类的特点是:容器中可以容纳其他组件,使用add()方法,可将其他对象加入到容器中。加入到容器中后,组件的位置和尺寸由布局管理器决定。常用的Container类的方法如下:1.add(Componentcomp):将指定组件放到容器中2.remove(Componentcomp):删除指定组件3.setLayout(LayoutManagermgr):设置容器布局,.,13,8.2标准组件,8.2.3控制组件基本的控制组件是用来提供人机交互的基本控制界面,包括:按钮(Button)单选按钮(CheckboxGroup)复选框(Checkbox)下拉列表框(Choice)画板(Canvas)列表框(List)标签(Label)文本组件(Textfield和TextArea)滚动条(Scrollbar)菜单(Menu)等等,.,14,8.2标准组件,8.2.3控制组件使用控制组件,通常需要如下步骤:1.创建某控制组件类的对象,指定其大小等属性。2.使用某种布局策略,将该控制组件对象加入到某个容器中的某个指定位置处。3.将该组件对象注册给它所能产生的事件对应的事件监听者,重载事件处理方法,实现利用该组件对象与用户交互的功能。,.,15,8.2标准组件,8.2.4Component类类java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括:publicvoidadd(PopupMenupopup):在组件上加入一个弹出菜单publicColorgetBackground():获得组件的背景色publicFontgetFont():获得组件使用的字体publicColorgetForeground():获得组件的前景色publicGraphicsgetGraphics():获得在组件上绘图时需要使用的Graphics对象publicvoidrepaint(intx,inty,intwidth,intheight):以指定的坐标点(x,y)为左上角,重画组件中指定宽度(width)、指定高度(height)的区域publicvoidsetBackground(Colorc):设置组件的背景色publicvoidsetEnabled(booleanb):设置组件的使能状态。参数b为true则组件使能,否则组件不使能。只有使能状态的组件才能接受用户输入并引发事件publicvoidsetFont(Fontf):设置组件使用的字体publicvoidsetSize(intwidth,intheight):设置组件的大小publicvoidsetVisible(booleanb):设置组件是否可见的属性。参数b为true时,组件在包括它的容器可见时也可见;否则组件不可见publicvoidsetForeground(Colorc):设置组件的前景色publicvoidrequestFocus():使组件获得焦点,.,16,8.2标准组件,8.2.4Component类类java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括:publicvoidadd(PopupMenupopup):在组件上加入一个弹出菜单publicColorgetBackground():获得组件的背景色publicFontgetFont():获得组件使用的字体publicColorgetForeground():获得组件的前景色publicGraphicsgetGraphics():获得在组件上绘图时需要使用的Graphics对象publicvoidrepaint(intx,inty,intwidth,intheight):以指定的坐标点(x,y)为左上角,重画组件中指定宽度(width)、指定高度(height)的区域,.,17,8.2标准组件,8.2.4Component类publicvoidsetBackground(Colorc):设置组件的背景色publicvoidsetEnabled(booleanb):设置组件的使能状态。参数b为true则组件使能,否则组件不使能。只有使能状态的组件才能接受用户输入并引发事件publicvoidsetFont(Fontf):设置组件使用的字体publicvoidsetSize(intwidth,intheight):设置组件的大小publicvoidsetVisible(booleanb):设置组件是否可见的属性。参数b为true时,组件在包括它的容器可见时也可见;否则组件不可见publicvoidsetForeground(Colorc):设置组件的前景色publicvoidrequestFocus():使组件获得焦点,.,18,8.3简单图形用户界面,8.3.1Frame与Panel一般我们要生成一个窗口,通常是用Window的子类Frame来进行实例化,而不是直接用到Window类。Frame的外观就像我们平常在windows系统下见到的窗口,有标题、边框、菜单、大小等等。每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize()来设置大小,调用setVisible(true)来设置该窗口为可见的。另外,AWT在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT程序在不同的操作系统平台下运行所看到的图形系统是不一样的。例如在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。,.,19,8.3简单图形用户界面,8.3.1Frame与PanelFrame类具有以下特点:Frame类是Window类的直接子类;Frame对象显示的效果是一个“窗口”,带有标题和尺寸;Frame默认初始化为不可见的,可使用setVisible(true)方法使之变为可见;默认的布局管理器是BorderLayout,可使用setLayout()方法改变其默认布局管理器。Frame的构造方法有:Framef=newFrame();Framef=newFrame(Strings);s为Frame的标题字符串。,.,20,8.3简单图形用户界面,8.3.1Frame与Panel使用Frame窗口时将会用到的几个方法:1.设置窗口大小setSize()这个方法用来设置窗口的大小,如下所示:voidsetSize(intnewWidth,intnewHeight)voidsetSize(DimensionnewSize)窗口的新的大小在变量newWidth和newHeight中被指定,或者在来自Dimension类的newSize对象的width和height这两个成员变量中被指定。这些大小使用像素为单位。2.获得当前的窗口大小getSize()这个方法被用来获得当前的窗口大小,如下所示:DimensiongetSize()这个方法返回一个Dimension对象,在这个对象的成员变量width和height中存放着当前窗口的大小。,.,21,8.3简单图形用户界面,8.3.1Frame与Panel3.隐藏和显示一个窗口当一个frame窗口被创建以后,这个窗口默认是不可见的,除非你调用它的setVisible()方法。如下所示:voidsetVisible(booleanvisibleFlag)如果这个方法的参数是true,那么调用它的组件是可见的。否则,就被隐藏。4.设置窗口标题你可以通过使用setTitle()方法来改变一个frame窗口的标题。如下所示:voidsetTitle(StringnewTitle)在这里,参数newtitle是窗口的新标题。,.,22,8.3简单图形用户界面,8.3.1Frame与Panel5.关闭frame窗口当使用一个frame窗口时,你的程序必须在它被关闭时通过调用setVisible(false)方法来将窗口从屏幕中除去。为了截获窗口关闭事件,你必须实现WindowListener监听器接口的windowClosing()方法。在windowClosing()方法中,你必须将窗口从屏幕中除去。在下一节中将讲解这种技术。,.,23,8.3简单图形用户界面,8.3.1Frame与PanelPanel类具有以下特点:Panel不是顶层窗口,它必须位于窗口或其他容器之内;Panel可以容纳其他组件,在程序中经常用于布局和定位;Panel默认的布局管理器是FlowLayout,可使用setLayout()方法改变其默认布局管理器;Panel可以采用和所在容器不同的布局管理器。,.,24,8.3简单图形用户界面,8.3.2字体设置Java中用Font类来设置字体。一个Font类的对象表示了一种字体显示效果,包括字体类型、字型和字号。Font类的构造方法如下:Font(Stringname,intstyle,intsize);其中,name代表字体名称,例如,可以是Helvetica、TimesRoman、Courier、宋体、楷体等。style代表字体风格,有三种字体风格静态变量,即:Font.BOLD:黑体Font.ITALIC:斜体Font.PLAIN:正常字体,.,25,8.3简单图形用户界面,8.3.2字体设置它们可以互相组合使用,例如:Font.BOLD+Font.ITALICsize代表字体大小,单位是point,一个point是1/72英寸。例如:Fontf=newFont(TimesRoman,Font.PLAIN,14);在组件中显示所用的字体可以用setFont()方法来设置。这个方法的参数应当是java.awt.Font类的实例。例如,使用Graphics类的参数g:g.setFont(f);设置按钮上的字体:Buttonbtn=newButton();Btn.setFont(f);书中表8-1列出了Font类的主要方法。,.,26,8.3简单图形用户界面,8.3.2字体设置另外,Java提供了几种文字的输出方法:1.drawBytes(bytebytes,intoffset,intnumber,intx,inty):字节输出方法2.drawChars(charchars,intoffset,intnumber,intx,inty):字符输出方法3.drawString(Stringstring,intx,inty):字符串输出方法其中,x、y代表输出字符的起始坐标位置,bytes是字节数组,chars是字符数组,string是字符串,offset是数组的起始下标,number是要绘制的元素个数。这三个方法都属于Graphics类,使用当前的颜色和字体来绘制字符。其中,drawstring()是最常用的方法。不同的系统中安装了不同的字体,为了得到本系统中所有已安装的字体,我们可以通过GraphicsEnvironment类的getAvailableFontFamilyNames方法来实现。该方法返回一个字符串数组,数组内包含所有可用的字体名。,.,27,8.3简单图形用户界面,8.3.3绘制简单图形绘制图形和文字都要用到Graphics类。Graphics是java.awt包中的一个类,其中包含了很多绘制图形和文字的方法,所以需要加载importjava.awt.*。由于Applet程序本身是图形界面,对于图形、图像的处理非常的方便,所以以下的程序主要使用Applet程序,需要加载importjava.applet.*。Graphics类主要的方法如书中表8-2所示。,.,28,8.3简单图形用户界面,8.3.3绘制简单图形绘制线段Java定义的窗口工作区是以整个屏幕的左上角为坐标原点(0,0),以象素为单位。绘制线段有drawLine()、drawPolyline()两种方法。1.drawLine()用来绘制一段直线。其语法如下:drawLine(intx1,inty1,intx2,int2);其中x1,y1代表选段的起点。x2,y2代表线段的终点。2.drawPolyline()用来绘制多边形线段。其语法如下:drawPolyline(intx,inty,intnpoints);其中x、y为多边形线段顶点坐标的位置。npoints表示多边形顶点的数目。,.,29,8.3简单图形用户界面,8.3.3绘制简单图形绘制矩形前面介绍的drawPolyline()若将顶点坐标设定,使画出线段距离大小一样,就可以画出一个正方形,也可以画出一个矩形。在Java语言中,绘制矩形有clearRect()、clipRect()、drawRect()、fillRect()和setClip()等方法。下面分别介绍如下:1.clearRect()用来清除矩形。其语法如下:clearRect(intx,inty,intw,inth);其中x,y为清除矩形左上角顶点的坐标。w为矩形的宽度,h为矩形的高度。2.clipRect()用来限制矩形的图形范围。其语法如下:clipRect(intx,inty,intw,inth);其中x,y为限制矩形图形范围左上角顶点的坐标。w为矩形的宽度,h为矩形的高度。,.,30,8.3简单图形用户界面,8.3.3绘制简单图形绘制矩形3.drawRect()用来绘制一个矩形。其语法如下:drawRect(intx,inty,intw,inth);其中x,y为绘制矩形左上角顶点的坐标。w为矩形的宽度,h为矩形的高度。4.fillRect()用来绘制一个矩形并在其封闭空间填充颜色。其语法如下:fillRect(intx,inty,intw,inth);其中x,y为绘制填满矩形的左上角顶点的坐标。w为矩形的宽度,h为矩形的高度。5.setClip()用来设定限制图形范围的矩形。其语法如下:setClip(intx,inty,intw,inth);其中x,y为设定限制图形范围矩形的左上角顶点的坐标。w为矩形的宽度,h为矩形的高度。,.,31,8.3简单图形用户界面,8.3.3绘制简单图形绘制圆矩形绘制圆矩形有drawRoundRect()和fillRoundRect()等方法。1.drawRoundRect()用来绘制圆矩形。其语法如下:drawRoundRect(intx,inty,intw,inth);其中x,y为绘制圆矩形左上角的坐标。w为圆矩形的宽度,h为圆矩形的高度。2.fillRoundRect()用来绘制圆矩形,并在其封闭空间填充颜色。其语法如下:fillRoundRect(intx,inty,intw,inth,intarcw,intarch);其中x,y为绘制圆矩形左上角的坐标。w为圆矩形的宽度,h为圆矩形的高度。arcw为圆矩形圆弧的宽度,arch为圆矩形圆弧的高度。,.,32,8.3简单图形用户界面,8.3.3绘制简单图形绘制弧形绘制弧形有drawArc()和fillArc()等方法。1.drawArc()用于绘制弧形。其语法如下:drawArc(intx,inty,intw,inth,intp,intq);其中x,y为绘制弧形的中心。w为弧形的宽度,h为弧形的高度。p为弧形的起始角度。q为弧形的弧度。q为正,表顺时针方向;q为负,表逆时针方向。2.fillArc()用于绘制填满内部的弧形。其语法如下:fillArc(intx,inty,intw,inth,intp,intq);其中x,y为绘制弧形的中心。w为弧形的宽度,h为弧形的高度。p为弧形的起始角度。q为弧形的弧度。q为正,表顺时针方向;q为负,表逆时针方向。,.,33,8.3简单图形用户界面,8.3.3绘制简单图形绘制椭圆形绘制椭圆形有drawOval()和fillOval()等方法。1.drawOval():用于绘制椭圆形。其语法如下:drawOval(intx,inty,intw,inth,);其中x,y为绘制椭圆形的圆心。w为椭圆形的宽度,h为椭圆形的高度。2.fillOval():用于绘制填满内部的椭圆形。其语法如下:fillOval(intx,inty,intw,inth);其中x,y为绘制椭圆形的圆心。w为椭圆形的宽度,h为椭圆形的高度。,.,34,8.3简单图形用户界面,8.3.4设置颜色绘图离不开颜色,图形中的颜色分前景色和背景色。显示的字符和图形的颜色用Color类的对象控制,每个Color对象代表一种颜色,用户可以直接使用Color类中定义好的颜色常量,也可以通过调配红、绿、蓝三原色的比例创建自己的Color对象。Color类中定义了三种构造方法:Color(floatr,floatg,floatb):指定三原色的浮点值,每个参数的取值范围在0.0至1.0之间。Color(intr,intg,intb):指定三原色的整数值,每个参数的取值范围在0至288之间。Color(intrgb):指定一个整数代表三原色的混合值,1623比特位代表红色,818比特位代表绿色,07比特位代表蓝色。不论使用哪个构造方法创建Color对象,都需要指定新建颜色中红、绿、蓝三色的比例。Color类中定义了13种颜色常量,使用时只需加上Color前缀,十分方便。Color的颜色常量如书中表8-3所示。,.,35,8.3简单图形用户界面,8.3.4设置颜色对于GUI的控制组件,它们有四个与颜色有关的方法分别用来设置和获取组件的背景色和前景色:publicvoidsetBackground(Colorc);publicColorgetBackground();publicvoidsetForeground();publicgetForeground();方法的参数是java.awt.Color类的实例。你也可以使用颜色常量,如Color.red,Color.blue等。例如,你可以创建一个特定的颜色:intr=288,g=288,b=0;Colorc=newColor(r,g,b);上述构造方法根据指定的红色、绿色和蓝色的数值(它们的范围都是0288)来创建一个颜色。,.,36,8.3简单图形用户界面,8.3.5显示图像图像是由专门的软件或截取图像的工具生成的文件。在Java的Graphics类中不仅提供了大量绘制图形的方法,还提供了一些方法来显示图像。我们需要图像文件在Java程序运行时,找到它的存储位置,将它加载到内存里,然后在适当的时候通过Graphics类中drawImage()方法将它显示在屏幕上就可以了。getImage()方法有两个参数,第一个参数是图像文件所在的URL(统一资源定位器)地址。在上面例子中由于图像文件与HTML文件保存在同一个路径下,所以使用Applet类的另一个方法getCodeBase()或getDocumentBase()来获取含有该Applet类的HTML文件的URL地址。getImage()方法的第二个参数是图像文件的文件名。,.,37,8.3简单图形用户界面,8.3.5显示图像由于Java是面向网络的,因此图像文件的存储位置并不局限于本地计算机的磁盘目录,大部分是直接读取web服务器上的图像文件。getImage()方法返回一个Image对象,它的调用格式为:ImagegetImage(URLurl)ImagegetImage(URLur1,Stringname)其中url是一个URL类的对象,代表一个网络地址,例如我们访问搜狐网站服务器指定位置的一幅图片:getImage(newURL(,.,38,8.3简单图形用户界面,8.3.5显示图像drawImage()方法的调用格式如下:booleandrawImage(Imageimg,intxrinty,ImageObserverobserver)booleandrawImage(Imageimg,intx,inty,Colorbgcolor,ImageObserverobserver)img是保存图像的Image对象。x,y是图像的左上角的坐标,它们决定了图像在容器中显示位置。bgcolor是图像显示区域的背景色。observer是图像加载跟踪器,通常将该参数指定为this,即由Applet负责跟踪图像的加载情况。drawImage()方法可以不失真地按比例对图像进行缩放。Java可以识别的图像文件格式有jpg、gif、jpeg等。,.,39,8.4Java事件处理,8.4.1Java事件处理机制如果用户在用户界面执行了一个动作,这将导致一个事件的发生。事件是描述发生了什么的对象。在Java中,定义了各种不同类型的事件类,用来描述各种类型的用户操作。事件是由事件源产生的,事件的产生者称为事件源。例如,在Button组件上点击鼠标会产生以这个Button为源的一个事件:ActionEvent。事件源拥有自己的方法,我们通过它向其注册事件监听器。事件监听器是一个类的实例,这个类实现了一个特殊的接口,称为Listenerinterface。当事件源产生了一个事件以后,事件源就会发送通知给相应的事件监听器,监听器对象根据事件对象内封装的信息,决定如何响应这个事件。,.,40,8.4Java事件处理,8.4.1Java事件处理机制所有的组件都从Component类中继承了将事件处理授权给监听器的方法:addXXXListener(ListenerTypelistener):/将事件源注册给事件处理程序(监听者)removeXXXListener(ListenerTypelistener):/取消事件源的注册在Java中,所有的事件都定义在类库java.awt.event中,用相应的类来表达不同的事件,例如键盘事件类KeyEvent,鼠标事件类MouseEvent等。这些事件类都是从AWTEvent类派生而来的。事件类的继承关系如图8-9所示。,.,41,8.4Java事件处理,8.4.1Java事件处理机制事件类的继承关系如图8-9所示。图8-9Java事件类的继承关系,图8-9Java事件类的继承关系,.,42,8.4Java事件处理,8.4.1Java事件处理机制AWT将事件分为两类:1.语义(Semantic)事件:ActionEvent:对应按钮点击、菜单选择、列表框选择、在文本域中按回车键等。AdjustmentEvent:用户调整滚动条。ItemEvent:用户从一组选择框或者列表项中进行选择。TextEvent:文本域或者文本框中的内容发生改变。2.低级(Low-Level)事件:ComponentEvent:组件大小改变、移动、显示或者隐藏。KeyEvent:键盘上的一个键被按下或者释放。MouseEvent:鼠标按键被按下、释放、鼠标移动或者拖动。FocusEvent:组件获得焦点或者失去焦点。WindowEvent:窗口被激活、屏蔽、最小化、最大化或关闭。ContainerEvent:添加或者删除一个组件。,.,43,8.4Java事件处理,8.4.2按钮点击事件按钮是最常用到的组件,因此它的事件处理是非常重要的。创建按钮的方法是:ButtonMyButton=newButton(“Java”);通过Container类的Add方法,将组件加入到该容器中。classMyPanelextendsPanelpublicMyPanel()ButtonMyButton=newButton(“Java”);add(MyButton);,.,44,8.4Java事件处理,8.4.2按钮点击事件然后为按钮设置监听器。指定的监听器必须实现ActionListener接口的actionPerformed方法:publicvoidactionPerformed(ActionEventevent)事件处理模型中的监听者都是通过实现在包java.awt.event中提供的监听者接口来获得的。每种事件都对应有相应的监听者接口,事件的处理方法都已经在该接口中定义了。,.,45,8.4Java事件处理,8.4.3捕获窗口事件Frame对象是窗口事件(WindowEvent)的事件源,要指定一个监听器对象:MyWindowListenerlistener=.;frame.addWindowListener(listener);监听器对象要实现WindowListener接口。WindowListener接口中共有七个方法,它们分别对应七个窗口事件:publicinterfaceWindowListenervoidwindowOpened(WindowEvente);voidwindowClosing(WindowEvente);voidwindowClosed(WindowEvente);voidwindowIconified(WindowEvente);voidwindowDeiconified(WindowEvente);voidwindowActivated(WindowEvente);voidwindowDeactivated(WindowEvente);,.,46,8.4Java事件处理,8.4.3捕获窗口事件WindowListener接口实现方法是:定义一个类来实现WindowListener接口,在需要的方法中添加我们需要的代码,然后让其他方法为空即可。classQuitWindowimplementsWindowListenerpublicvoidwindowClosing(WindowEvente)System.exit(0);voidwindowOpened(WindowEvente)voidwindowClosed(WindowEvente)voidwindowIconified(WindowEvente)voidwindowDeiconified(WindowEvente)voidwindowActivated(WindowEvente)voidwindowDeactivated(WindowEvente)使用以上代码,我们可以关闭一个Frame窗口。,.,47,8.4Java事件处理,8.4.4键盘事件键盘事件对应着KeyEvent类,对应三个具体的事件:KEY_PRESSED(按下键)、KEY_RELEASED(松开键)、KEY_TYPED(击键)。判断一个KeyEvent类的对象到底代表哪种事件,可以用它的方法getID()的返回值与事件常量相比来得到。KeyListener接口中有三个方法:publicvoidkeyPressed(KeyEvente)publicvoidkeyReleased(KeyEvente)publicvoidkeyTyped(KeyEvente),.,48,8.4Java事件处理,8.4.4键盘事件Java对于用户按键的处理过程:当前键盘状态为小写状态,要输入一个大写字母“A”,我们的操作过程为:先按住Shift键不放,再按下A键,然后松开。整个过程Java会产生五个事件:按下Shift键:为VK_SHIFT调用keyPressed方法;按下A键:为VK_A调用keyPressed方法;键入字符“A”:为字符“A”调用keyTyped方法;松开A键:为VK_A调用keyReleased方法;松开Shift键:为VK_SHIFT调用keyReleased方法。,.,49,8.4Java事件处理,8.4.5鼠标事件鼠标事件对应MouseEvent类。它有两个监听者接口与之对应,一个是MouseListener接口(它有五个事件);一个是MouseMotionListener接口(它有两个事件)。MouseListener接口:mousePressed:鼠标键被按下时调用;mouseReleased:鼠标键被释放时调用;mouseClicked:合并上述两个事件为一次鼠标点击事件。mouseEntered:进入指定的区域。mouseExited:离开指定的区域。它们的参数是MouseEvent,通过getX和getY方法,能够得到鼠标点击时的鼠标指针x和y的坐标。通过getClickCount方法,可以区别是单击操作,还是双击操作。MouseMotionListener接口:mouseMoved:鼠标移动;mouseDragged:用户拖动鼠标。,.,50,8.4Java事件处理,8.4.6焦点事件如果某个组件能够接收用户按键,那么该组件就拥有焦点。拥有焦点的组件在显示形式上与其他组件有一些差别:文本域内会显示光标;按钮四周会显示一个由虚线组成的矩形框。可以捕获丢失的焦点事件来进行输入的合法性检查。如果输入不合法,通过调用requestFocus方法把焦点重新移回到该文本域,提示用户重新输入:publicvoidfocusLost(FocusEventevent)if(event.getComponent()=passTextJava支持的事件类型很多,书中表8-4列出了Java中各个事件类型、接口及相关方法。,.,51,8.4Java事件处理,一般说来,每个事件类都至少有一个监听者接口与之相对应,而事件类中的每个具体事件类型都有一个具体的抽象方法与之相对应。当具体事件发生时,这个事件将被封装成一个事件类的对象作为实际参数传递给与之对应的具体方法,由这个具体方法负责响应并处理发生的事件。在一个类中可以实现多个监听者接口,通过它可以同时监听同一个事件源上发生的多种事件。同时,通过事件可以获得事件的详细信息。,.,52,8.4Java事件处理,8.4.7事件适配器由于通过实现接口XXXListener来完成事件处理时,要同时实现该接口中的所有方法。但是有时候,我们只是需要对其中的某些方法做处理,而不想实现所有的无关方法。因此,为了方便起见,Java为某些监听者接口提供了适配器类(XXXAdapter),当需要对某种事件进行处理时,只需让事件处理类继承事件所对应的适配器类,只重写需要关注的方法即可,而无关的方法就不必实现了。适配器是一个类而不是接口,因而处理事件的类只能继承一个适配器。当该类需要处理多种事件时,通过继承适配器类的方式是不行的。但可以基于适配器类,用内嵌类(InnerClass)的方法来处理这种情况。事件适配器包括以下几种:ComponentAdapter:组件适配器;ContainerAdapter:容器适配器;FocusAdapter:焦点适配器;KeyAdapter:键盘适配器;MouseAdapter:鼠标适配器;MouseMotionAdapter:鼠标运动适配器;WindowAdapter:窗口适配器;,.,53,8.5布局管理,在Java的GUI界面设计中,布局控制是相当重要的一环节。将一个组件加入容器中时,布局控制决定了所加入的组件的大小和位置。而布局管理器能自动设定容器中的组件的大小和位置,当容器改变大小时,布局管理器能自动地改变其中组件的大小和位置。java.awt包中共定义了五种布局管理类,每个布局管理类对应一种布局策略,分别是FlowLayout,BorderLayout,CardLayout,GridLayout和GridBagLayout。下面将详细讨论这几种布局管理器。,.,54,8.5布局管理,8.5.1FlowLayout类FlowLayout是容器Panel和Applet类默认使用的布局管理器,如果不专门为Panel或Applet指定布局管理器,则它们就使用FlowLayout。FlowLayout对应的布局策略非常简单。这种策略配置组件的方式是:1.组件按照加入的先后顺序从左向右排列。2.一行排满之后就下转到下一行继续从左至右排列。3.每一行中的组件都居中排列。在组件不多时,使用这种策略非常方便,但是当容器内的GUI元素增加时,就显得高地参差不齐。表8-5列出了FlowLayout的属性。,.,55,8.5布局管理,8.5.1FlowLayout类对于使用FlowLayout的容器,加入组件使用如下简单的命令:add(组件名);这些组件将顺序的排列在容器中。如果一个容器原来不使用FlowLayout布局方式,现在要改为FlowLayout布局策略,使用如下的语句:setLayout(newFlowLayout();setLayout()方法是所有容器的父类Container的方法,用于为容器设定布局。如果想将组件设定缺省居中的话,FlowLayout构造方法中的参数允许将组件左对齐或右对齐。对齐的值必须是FlowLayout.LEFT,FlowLayout.RIGHT,或FlowLayout.CENTER。例如:setLayout(newFlowLayout(FlowLayout.RIGHT,20,40);,.,56,8.5布局管理,8.5.2BorderLayout类BorderLayout是容器Frame和Dialog默认使用的布局管理器。BorderLayout也是一种简单的布局管理策略。它把容器内的空间划分成五个明显的区域:东、南、西、北、中。北占据容器的上方,东占据容器的右侧,南占据容器的下方,西占据容器的左侧。中间区域是在东、南、西、北都填满后剩下的区域。当窗口垂直延伸时,南、北、中区域也延伸;而当窗口水平延伸时,东、西、中区域也延伸。如果某个区域没有分配组件,则其他组件可以占据它的空间。例如,如果北部没有分配组件,则西部和东部的组件将向上扩展到容器的最上方。如果东部和西部没有分配组件,则位于中部的组件将横向扩展到容器的左右边界。书中表8-8列出了BorderLayout的属性。,.,57,8.5布局管理,8.5.3GridLayout类GridLayout布局方式可以使容器中的各组件呈网格状分布。容器中各组件的高度和宽度相同,当容器的尺寸发生变化时,各组件的相对位置不变,但各自的尺寸会发生变化。各组件的排列方式为:从上到下,从左到右。与BorderLayout类相类似,如果想在一个网格单元中添加多个组件,则必须先在该网格单元放一个容器,再将多个组件放在该容器中。书中表8-11列出了GridLayout的构造方法。,.,58,8.5布局管理,8.5.4CardLayout类CardLayout类在处理容器内的组件时,容器表面上可以容纳多个组件。但在同一个时间容器只能从这些组件中选出一个来显示,就像一副扑克牌每次只能显示最上面的一张一样,而且可以向前翻阅组件,也可以向后翻阅组件书中表8-13列出了CardLayout的构造方法。,.,59,8.5布局管理,8.5.5GridBagLayout类GridBagLayout布局方式是AWT中最灵活、同时也是最复杂的一种布局方式。与GridLayout相同,它也是将容器中的组件按照行、列的方式放置,但各组件所占的空间可以互不相同。GridBagLayout根据对每个组件所施加的空间限制、每个组件自身所设定的最小尺寸和最佳尺寸来为每个组件分配空间。对组件施加空间限制是通过类GridBagConstraints来实现的。,.,60,8.6常用标准组件,组件允许用户同应用程序用各种方式进行交互,例如,一个常用的组件是按钮。下面我们介绍GUI常用组件的使用方法,希望大家从中可以体会出每个组件的特点。8.6.1按钮(Button)按钮在实际应用中比较常见,通常用来触发某个事件的发生,提供了“按下并动作”的基本用户界面。例如,点击播放按钮,开始播放音乐等。按钮一般对应一个事先定义好的功能操作,并对应一段程序。当用户点击按钮时,系统自动执行与该按钮相联系的程序,从而完成预先指定的功能。1.创建按钮用相应的构造方法来创建按钮,如书中表8-1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论