第7章图形用户界面的设计与实现课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第7章图形用户界面的设计与实现课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形 用户界面 设计 实现 课件
- 资源描述:
-
1、第7章 图形用户界面的设计与实现7.1 图形用户界面概述7.2 用户自定义成分7.3 Java的事件处理7.4 GUI标准组件概述7.5 标签、按钮与动作事件7.6 文本框、文本区域与文本事件7.7 单、复选按钮,列表与选择事件7.8 滚动条与调整事件7.9 画布与鼠标、键盘事件7.10 布局设计7.11 Panel与容器事件7.12 Frame与窗口事件7.13 菜单的定义与使用7.14 对话框、组件事件与焦点事件在Java语言中,为了支持图形用户 界 面 的 开 发,设 计 了 类 库java.awt包来生成各种标准图形界面元素和处理图形界面的各种事件。AWT是abstract windo
2、w toolkit(抽象窗口工具集)的缩写。7.1 图形用户界面概述图形用户界面的构成:图形用户界面是一组图形界面成分和界面元素的有机组合,这些成分和元素之间不但外观上有着包含、相邻、相交等物理关系,内在的也有包含、调用等逻辑关系,它们互相作用、传递消息,共同组成一个能响应特定事件、具有一定功能的图形界面系统。设计和实现图形用户界面的工作主要两个:创建组成界面的各元素,指定它们的属性和位置关系,构成完整的图形用户界面的外观。定义图形用户界面的事件和各界面元素对不同事件的响应,实现与用户的交互。Java中构成图形用户界面的各种元素和成分有三类:容器、控制组件和用户自定义成分。1.容器容器是用来组
3、织其他界面成分和元素的单元。一个应用程序的图形用户界面首先对应于一个复杂的容器,如一个窗口。利用容器有利于分解图形用户界面的复杂性,当界面的功能较多时,可以使用嵌套的容器。2.控制组件控制组件是图形用户界面的最小单位之一,它里面不再包含其他的成分。控制组件的作用是完成与用户的一次交互,包括接收用户的一个命令(如菜单命令),接收用户的一个文本或选择输入,向用户显示一段文本或一个图形,等等。使用控制组件的步骤:(1)创建某控件类对象,指定属性。(2)使用某种布局,将该控件对象加入到某容器中的指定位置。(3)将该组件对象注册给它所能产生的事件对应的事件监听者,重载事件处理方法,实现利用该组件对象与用
4、户交互的功能。实际上,容器也是一种控件,因为一个容器也可以被视为组件而包含在其他容器的内部。3.用户自定义成分绘制几何图形、使用标志图案等。用户自定义成分不能被系统识别和承认,通常只能起到装饰、美化的作用,而不能响应用户的动作,也不具有交互功能。Graphics是java.awt包中一个类,包含绘制图形和文字的方法。当一个Applet运行时,执行它的浏览器自动为它创建一个Graphics实例,利用这个实例,可在Applet中随意绘制图形和文字。若需在图形界面的Java Application程序中绘制图形,则需创建一个Canvas类的对象加入到该Application程序的图形界面容器中,Ca
5、nvas对象也有一个与Applet类的paint()方法相同的paint()方法,利用系统传递给这个paint()方法的Graphics类参数对象就可以在Application程序的图形用户界面中绘制各种图形和文字。7.2 用户自定义成分7.2.1 绘制图形利用Graphics类可绘制的图形有直线、各种矩形、多边形、圆和椭圆等。例 7-1 UsedDrawFigures.javaimport java.awt.*;import java.applet.Applet;public class UsedDrawFigures extends Applet public void paint(Gra
6、phics g)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)
7、;/画椭圆框 g.fillOval(130,100,50,40);/画实心椭圆 drawMyPolygon(g);/自定义的画多边形的方法 g.drawString(They are figures!,100,220);public void drawMyPolygon(Graphics g)int xCoords=30,50,65,119,127;/保存多边形各点x坐标的数组 int yCoords=100,140,127,169,201;/保存多边形各点y坐标的数组 g.drawPolygon(xCoords,yCoords,5);/画自由多边形框 7.2.2 显示文字Graphics类的
8、方法drawString()可在屏幕的指定位置显示一个字符串。Font类,可获得更丰富多彩和逼真精确的字体显示效果。一个Font类的对象表示了一种字体显示效果,包括字体、字型和字号。例如:Font MyFont=new Font(“TimesRoman”,Font.BOLD,12);MyFont对应的是12磅TimesRoman类型的黑体字,其中指定字型时需要用到Font类的三个常量:Font.PLAIN,Font.BOLD,Font.ITALIC。若需使用该Font对象,可利用Graphics类的setFont()方法:g.setFont(MyFont);若指定控件的字体效果,如按钮或文本框
9、等,可使用控件的方法setFont()。设btn是按钮对象,则语句:btn.setFont(MyFont);把该按钮上显示的字体改为12磅的TimesRoman黑体字。getFont()方法将返回当前Graphics或组件对象使用的字体。例 7-2 AvailableFonts.javaimport java.applet.*;import java.awt.*;public class AvailableFont extends Applet GraphicsEnvironment gl=GraphicsEnvironment.getLocalGraphicsEnvironment();St
10、ring FontNames=gl.getAvailableFontFamilyNames();public void paint(Graphics g)Font current,oldFont;oldFont=g.getFont();for(int i=0;iFontNames.length;i+)current=new Font(FontNames i,Font.PLAIN,10);g.setFont(current);g.drawString(current.getName(),10+i%4*120,20+i/4*15);g.setFont(oldFont);7.2.3 控制颜色Appl
11、et中显示的字符串或图形的颜色可以用Color类的对象来控制,每个Color对象代表一种颜色,用户可以直接使用Color类中定义好的颜色常量,也可通过调配红、绿、蓝三色的比例创建自己的Color对象。Color类定义了三种构造函数:public Color(int Red,int Green,int Blue);/整型参数指定R,G,B的取值范围在0255之间public Color(float Red,float Green,float Blue);/浮点参数R,G,B的取值范围在0.01.0之间public Color(int RGB);/整型参数指明RGB三色比例,这个参数的07比特(取
12、值范围为0255)代表红色的比例,815比特代表绿色的比例,1623比特代表蓝色的比例例:创建蓝色:Color blueColor=new Color(0,0,255);Graphics对象的setColor():把当前的缺省颜色修改成新建的颜色,此后调用该Graphics对象完成的绘制工作,如绘制图形、字符串等,都使用这个新建颜色:g.setColor(blueColor);除了创建自己的颜色,也可以直接使用Color类中定义好的颜色常量,如:g.setColor(Color.cyan);Color类中共定义了13种静态颜色常量,包括black,orange,pink,grey等,使用时只需
13、以Color为前缀。对于GUI的控制组件,它们有四个与颜色有关的方法分别用来设置和获取组件的背景色和前景色:public void setBackground(Color c)public Color getBackground()public void setForeground()public Color getForeground()import java.applet.*;import java.awt.*;public class MyUseColor extends Applet Color oldColor;String ParamName=red,green,blue;/三个H
14、TML参数的名称 int RGBarray=new int3;/保存三色比例的数组 public void init()for(int i=0;iParamName.length;i+)/取得HTML文件指定的三色 RGBarrayi=Integer.parseInt(getParameter(ParamNamei);public void paint(Graphics g)oldColor=g.getColor();/保存原有的缺省颜色 g.setColor(new Color(RGBarray0,RGBarray1,RGBarray2);/置新颜色 g.drawString(How do
15、you think about Current color:+g.getColor().toString(),10,20);/用新建颜色显示该颜色的三色分量 g.setColor(oldColor);/恢复原有颜色 g.drawString(Back to old default color:+g.getColor().toString(),10,40);例 7-3 UseColor.javaHTML文件如下:UseColor 通过改变三个参数的数值(应在0255之间),就可以指定不同的颜色而不需要重新编译Java Applet程序。7.2.4 显示图像图像文件有多种格式,如bmp文件、gif
16、文件、tiff文件等等,其中gif是Internet上常用的图像文件格式。Java中可以利用Graphics类的drawImage()方法来显示图像。import java.awt.*;import java.applet.Applet;public class UsedDrawMyImage extends Applet Image myImage;public void init()myImage=getImage(getDocumentBase(),Winter.gif);public void paint(Graphics g)g.drawImage(myImage,0,0,this)
17、;/显示图像 例 7-4 UsedDrawMyImage.javadrawImage()是Graphics类中用来显示图像的方法。第一个参数保存有图像数据的Image对象。第二、第三个参数是图像的左上角点坐标,它们决定了图像在容器中的显示位置。最后一个参数是显示图像的容器对象。this代表当前的Applet对象。获取、显示本机其它位置处的图像获取、显示本机其它位置处的图像:Image myImage=getToolkit().getImage(“E:新建相册IMG_0207.jpg”);或:Image myImage=Toolkit.getDefaultToolkit().getImage(E
18、:新建相册IMG_0207.jpg);显示来自网上的某张图片:显示来自网上的某张图片:1.myImage=this.getToolkit().getImage(new URL(http:/ URL(http:/ 实现动画效果动画是Java Applet最吸引人的特性之一。用Java实现动画的原理与放映动画片类似,取若干相关的图像或图片,顺序、连续地在屏幕上先显示,后擦除,循环往复就可以获得动画的效果。例 7-5 MyShowAnimator.javaimport java.applet.Applet;import java.awt.*;public class MyShowAnimator e
19、xtends Applet int x=10;Image m_Images;/保存图片序列的Image数组 int totalImages=5;/图片序列中的图片总数 int currentImage=0;/当前时刻应显示的图片序号 public void init()m_Images=new ImagetotalImages;/从当前目录下的images子目录中将Img001.gif到Img0010.gif的文件加载 for(int i=0;itotalImages;i+)m_Imagesi=getImage(getDocumentBase(),imageswinter00+(i+1)+.g
20、if);public void start()currentImage=0;/从第一幅开始显示 public void paint(Graphics g)g.drawImage(m_ImagescurrentImage,x,50,this);/显示当前序号的图片 x+=20;currentImage=+currentImage%totalImages;/计算下一个应显示图片的序号 try Thread.sleep(200);/程序休眠50毫秒 catch(InterruptedException e)/处理执行休眠方法可能引发的异常 showStatus(e.toString();repain
21、t();/图片停留50毫秒后被擦除,重新调用paint()显示下一张图片 Thread.sleep():使当前的程序线程休眠一段时间,以便每幅图片在下一幅图片显示之前在屏幕上逗留一时间,线程的具体编程将在以后章节介绍。getImage()方法获取所有的.gif图像文件(注意目录)。paint()方法一次显示一幅图像,稍后再显示Image对象数组中的下一幅图像。图形用户界面事件响应的基本原理图形用户界面事件响应的基本原理:键盘或鼠标操作能引发系统预先定义好的事件,用户程序只需要编制代码定义每个特定事件发生时程序应做出何种响应即可。这些代码会在它们对应的事件发生时由系统自动调用。Java中,除了键
22、盘和鼠标操作,系统的状态改变、标准图形界面元素等都可以引发事件,对这些事件分别定义处理代码,就可保证应用程序在不同状况下都合理有效、有条不紊地正常工作。Java的事件处理机制中引入了委托事件模型(如下图),不同的事件由不同的监听者处理。7.3 Java的事件处理委托事件模型图形用户界面的每个可能产生事件的组件叫事件源,不同事件源上发生的事件的种类不同。如,Button对象或MenuItem对象等作为事件源可能引发ActionEvent类代表的事件ACTION-PERFORMED;Checkbox对象等作为事件源可能引发ItemEvent类代表的事件ITEM-STATE-CHANGES。希望事件
23、源上发生的事件被程序处理,应把事件源注册给能够处理该事件源上那种类型事件的监听者。例 如 B u t t o n 对 象 把 自 己 注 册 给 实 现 了ActionListener接口的对象,因为只有这种对象能够处理Button对象上发生的ActionEvent类的事件,监听者可以是包容事件源的容器,也可为另外的对象。注册方法是通过调用事件源本身的相关方法,例如调用Button类自身的addActionListener()方法,并以监听者对象作为实际参数来实现的。监听者具有监听和处理某类事件的功能,因为它实现了有关的接口,所以监听者需要对它所实现接口的所有抽象方法写出具体的方法体,对应事件
24、源上发生的事件的处理代码就写在这些方法体中。例如对Button上发生的事件的处理代码就是 写 在 B u t t o n 对 象 所 注 册 的 监 听 者 的actionPerformed()方法中,这个方法是对ActionListener接口中同名抽象方法的具体实现。当事件源上发生监听者可以处理的事件时,事件源把这个事件作为实际参数传递给监听者中负责处理这类事件的方法(委托),该方法被系统自动执行后,事件就得到了处理。监听者不一定是包容事件源的容器对象,这使程序中的事件处理代码与GUI界面构成代码可以分离,利于优化程序结构;另外,由于Java对事件作了详细的分类并委托不同的接口方法来处理,
25、这也提高了的代码性能。AWTEvent类体系结构图Java的所有事件类和处理事件的监听者接口都定义在java.awt.event包中,事件类的层次结构如右图。上 图 中 包 括 的 事 件 类 基 本 都 是j a v a.a w t.A W T E v e n t 类 的 子 类,而java.awt.AWTEvent类则是java.util.EventObject类的 子 类。E v e n t O b j e c t 的 一 个 重 要 方 法 是getSource(),该方法返回产生事件的事件源,几乎所有的事件类都要用到该方法。注意:注意:并非每个事件类都只对应一个事件,例如KeyEve
展开阅读全文