




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章applet程序设计,Java教材编写组,教学目标,了解applet的工作原理掌握创建applet的方法掌握Applet类的主要方法掌握applet支持多媒体的技术和方法,applet基础,在Java中,有两种类型的程序,应用程序(application)和小程序(applet)。Javaapplet可以被HTML页面引用,并可以在支持Java的浏览器中执行,可以说applet具有激活因特网的强大功能。本节将介绍applet的工作原理以及如何编写一个简单applet小程序。,引例,例10.1在applet窗口中显示一蓝色和一红色圆。蓝色圆为左上角坐标为(20,20),宽度和高度都为60的正方形区域的内切圆,红色圆为左上角坐标为(60,60),宽度和高度分别为100的正方形区域的内切圆,显示效果如图10-1所示,请看下面的源代码。,/文件名Ex10_1.Javaimportjava.awt.*;/装载Graphics类importjava.applet.Applet;/装载Applet类publicclassEx10_1extendsAppletpublicvoidpaint(Graphicsg)g.setColor(Color.blue);/设置绘图颜色为蓝色g.fillOval(20,20,60,60);/绘出图形并填满蓝色g.setColor(Color.red);/设置绘图颜色为红色g.fillOval(60,60,100,100);/绘出图形并填充红色,引例(续),编写与编译好Ex10_1.java之后,使用appletviewerEx10_1.html,就可以执行Javaapplet的字节码文件。下面是Ex10_1.html文件的具体内容。,例10.1的运行结果,程序分析:将编写好的Ex10_1.html同Ex10_1.class放在同一文件夹下,就可以用appletviewer命令来观看applet的运行结果。在类Ex10_1里唯一的方法就是paint(),并在这个方法里分别以蓝色和红色绘了两个大小不同的椭圆。Applet类继承自Container类,而paint()方法是定义在Container类之内,因此Applet类自然继承Container类的paint()方法。Applet的画面相当于一个窗口,因此当上述的情况发生在applet身上时,applet自然会调用paint()方法来重新绘制画面。,引例(续),applet与HTML、WWW,对于小程序来说,在JDK中,这个解释器就是文件appletviewer.exe。同时,applet是可以在与Java兼容的Internet浏览器上运行的,也就是说,兼容Java的Internet浏览器可装载和执行Javaapplet的字节码文件。由于applet在Web浏览器环境中运行,所以它并不直接由键入的一个命令启动。必须要创建一个HTML文件来告诉浏览器需装载什么以及如何运行它。在WWW服务器上存放了很多的Web页,这些页面都是由HTML语言(又称超文本标记语言,是HyperTextMarkupLanguage的缩写)编写的。用户使用兼容Java的WWW浏览器浏览页面,如果在访问的HTML文件的某个地方有特殊的标记,表明它嵌有一个applet时,浏览器会根据这个applet标记的名字和位置自动把字节码(.class文件)从WWW服务器上下载到本地,并利用浏览器本身拥有的Java解释器来执行该字节码文件。applet的基本工作原理如图10-2所示。,applet与HTML、WWW(续),图10-2applet的基本工作原理,applet的创建,可以编写两种类型的applet。一种是使用Applet类来实现,另一种是使用JApplet类来实现的。JApplet类是Applet类的一个直接子类。如果想用Swing集合来实现Applet,那么编写的applet应该继承JApplet类。要编写一个applet,可以用以下方式创建一个类:importjava.applet.*;publicclassHelloWorldextendsAppletHelloWorld类必须为public,且它的名称必须与它所在的文件名匹配,在这里,就是HelloWorld.java.而且,该类必须为java.applet.Applet的子类。,applet的层次结构,Applet类的层次,Java.applet.Applet类实际上是java.awt.Panel的子类。Applet和AWT类的层次如下图所示。,applet的初始化与终止,在一个Java应用程序中,程序由main()方法处进入,而在一个applet中却不是这样。在构造方法完成任务后,浏览器调用init()方法对applet进行基本的初始化操作。init()方法结束后,浏览器调用另一个称为start()的方法,start()方法通常在applet成为可见时被调用。方法init()和start()都是在applet成为“活动的”之前运行完成的,正因为这样,它们都不能用来编写applet中继续下去的动作。实际上,与一个应用程序中的方法main()不同的是,没有方法的执行是贯穿于applet的整个生命过程的。此外,在编写Applet子类时可用的方法还有:stop(),destroy()和paint()。,applet的初始化与终止方法,1.publicvoidinit()该方法用于applet的初始化。当applet第一次加载时,该方法会被自动调用。在这个方法中,可以做一些必要的初始化的工作,这些内容包括创建和初始化程序运行所需要的对象实例,把图形或字体载入内存,处理PARAM参数等。2.publicvoidstart()该方法用来启动浏览器运行applet的主线程。调用init()方法将applet的初始化工作完成之后,start方法会自动调用;当用户刷新包含applet的页面或者从其他页面返回包含applet的页面时,start()方法会被自动调用。也就是说,start()方法可以被多次调用,这与init()方法是有区别的。基于这样的原因,可以把只调用一次的代码放在init()方法中,而不能放在start()方法中。,applet的初始化与终止方法(续),3.publicvoidstop()该方法在用户离开包含applet的页面时会被自动调用。同start()方法,stop()方法也可以被多次调用。当stop()方法被调用时,将停止一些耗费系统资源的活动,如播放动画等。如果在applet中没有动画或者音乐文件的播放,可以不使用这个方法。4.publicvoiddestroy()当用户正常关闭浏览器时,浏览器会调用destroy()方法。该方法用于回收系统资源,如回收图形用户界面的系统资源、关闭连接等。至于applet实例本身,会由浏览器来负责从内存中清除,不需要在destroy()方法中清除。applet类提供的四个方法init()、start()、stop()和destroy()分别对应了applet的初始化、启动、暂停和直到消亡的各个阶段。图10-4说明了applet的生命周期和对应的方法,applet的初始化与终止的方法图示,applet生命周期的一个示例,/文件名Ex10_2.javaimportjava.awt.*;importjava.applet.Applet;publicclassEx10_2extendsAppletpublicvoidinit()System.out.println(init()methodcalled!);publicvoidstart()System.out.println(start()methodcalled!);publicvoidstop()System.out.println(stop()methodcalled!);publicvoiddestroy()System.out.println(destroy()methodcalled!);publicvoidpaint(Graphicsg)g.drawString(HelloWorld!,50,80);System.out.println(paint()methodcalled!);,下面是Ex10_2.htm文件内容:,applet生命周期的一个示例(续),Ex10_2的运行结果,程序分析:在Ex10_2中,设计了一个简单的机制,即利用System.out.println()方法把被调用的init()、start()、stop()、destroy()和paint()5个方法名输出到Java的控制台用来监控init()、start()、stop()、destroy()与paint()的运行情况。只要这些方法被运行时,在Java的控制台上便会出现哪一个方法被执行。运行Ex10_2.htm后,执行把浏览器缩小、放大、切换页面、刷新等操作,看看这些操作发生时,有哪些方法被调用以及调用的顺序是怎样的。,applet生命周期的一个示例(续),application与applet,application程序有如下主要特点:Javaapplication程序是独立完整的程序在命令行调用独立的解释器软件即可运行Javaapplication程序Javaapplication程序的主类必须有一个定义格式如下,publicstaticvoidmain(Stringarsg)的main()方法,这是Javaapplication程序执行的入口点。Javaapplet的一些特点:Javaapplet程序是在WWW浏览器环境下运行,即不是完整的独立运行程序。运行Javaapplet程序的解释器不是独立的软件,而是嵌在WWW浏览器中作为浏览器软件的一部分。Javaapplet程序中不需要有main()方法,但是Javaapplet程序的主类必须是类库中已定义好的类Applet或JApplet的子类。Javaapplet程序可以直接利用浏览器或者appletviewer运行图形用户界面,而Javaapplication程序必须另外书写专门代码来创建自己的图形界面。,application与applet的结合示例,/文件名Ex10_3.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassEx10_3extendsJAppletpublicvoidinit()ContainercontentPane=getContentPane();JLabellabel=newJLabel(Applicationandapplet!,SwingConstants.CENTER);contentPane.add(label);publicstaticvoidmain(Stringargs)finalJFramef=newJFrame();JAppletapplet=newEx10_3();applet.init();f.setContentPane(applet.getContentPane();f.setBounds(50,50,300,200);f.setTitle(Applicationandapplet!);f.setVisible(true);f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);f.addWindowListener(newWindowAdapter()publicvoidwindowClosed(WindowEvente)System.exit(0););,application与applet的结合示例(续),图10-6例Ex10_3作为应用程序运行的结果,图10-7例Ex10_3作为小程序在网页中运行的结果,application与applet的结合示例(续),程序分析:其实现思想是这样的,首先创建一个小程序,这个小程序包含一个main()方法,这个main()方法把JFrame实例化,而且还创建这个小程序的一个实例。在调用小程序的init()方法后,窗体用该小程序的内容面板来替代该窗体的内容面板。这个窗体接着设置其边界和标题,并把它的可见性设置为true。如上所示,这种小程序和应用程序的组合实际上是共享一个内容面板。当Ex10_3.java被编译后,它既可作为小程序运行,也可作为应用程序运行。,applet中图像的显示,Graphics类中提供了不少绘制图形的方法,但对于复杂图形,大部分都事先利用专用的绘图软件绘制好,或者是用其他截取图像的工具获取图像的数据信息,再将它们按照一定的格式存入图像文件。Java程序运行时,将它装载到内存里,然后在适合的时机将它显示在屏幕上。Java特别提供了java.awt.Image类来管理与图像文件有关的信息,因此执行与图像文件有关的操作时需使用import引用这个类。ImagegetImage(URLurl)ImagegetImage(URLurl,Stringname)类URL代表一个统一资源定位符,它是指向互联网资源的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。而要将得到的Image图像显示在屏幕上,则Applet类中提供了getImage()方法将准备好的图像文件装载到applet中,但必须首先指明图像文件所存储的位置。,applet中图像的显示(续),GetImage()方法的调用格式有以下两种,这两种调用格式的返回值都是Image对象。DrawImage()方法的调用格式如下:booleandrawImage(Imageimg,intx,inty,ImageObserverobserver)其中img参数就是要显示的Image对象,x和y参数是该图像左上角的坐标值,observer参数则是一个ImageObserver接口,它用来跟踪图像文件装载是否已经完成的情况,通常都将该参数置为this,即传递本对象的引用去实现这个接口。除了将图像文件照原样输出外,drawImage()方法的另外一种调用格式还能指定图像显示的区域大小:,booleandrawImage(Imageimg,intx,inty,intwidth,intheight,ImageObserverobserver)这种格式比第一种格式多了两个参数width和height,即表示图像显示的宽度和高度。若实际图像的高度和宽度与这两个参数值不一样,Java系统会自动将它进行缩放,以适合选定的矩形区域调用Image类的两个方法就可以分别得到原图的宽度和高度,它们的调用格式如下:intgetWidth(ImageObserverobserver)intgetHeight(ImageObserverobserver)同drawImage()方法一样,通常用this作为observer的参数值。,applet中图像的显示(续),applet中图像显示的一个示例,例10.4在applet中加载一个jpg格式图片。/文件名Ex10_4.javaimportjava.awt.*;importjava.awt.eve中nt.*;importjava.applet.Applet;publicclassEx10_4extendsAppletImageimg;/声明Image类型的变量imgpublicvoidinit()img=getImage(getCodeBase(),flower.jpg);/加载flower.jpg图片publicvoidpaint(Graphicsg)g.drawImage(img,40,40,this);/将img画在applet上,下面是相应的Ex10_4.htm文件内容:,applet中图像显示的一个示例(续),运行结果:,程序分析:在Ex10_4.java中,先声明Image类型的变量img,它可用来存放图形影像。然后利用getImage(getCodeBase(),“flower.jpg”)来加载图片flower.jpg,并把加载的图片给变量img,而getCodeBase()是用来取得applet程序所在的目录,因此在本例中,flower.jpg与Ex10_4.java必须置于同一个目录下才能运行。注意把getImage()命令编写在init()方法中,只要applet一运行,flower.jpg便会自动加载。最后在paint()方法里,利用drawImage(img,40,40,this)把img加载,并把图像的左上角置于(40,40)处。这里的this关键字代表图片所显示的区域为目前的这个applet。,声音的加载和播放,Java编程语言也具有播放音频文件的方法,这些方法在java.applet.AudioClip类中。利用Java2中,可以播放WAV、AIFF、MIDI、AU和RMT格式的文件。播放音频文件的最简单的方式是通过applet的play()方法,有两个形式,play(URLsoundDirectory,StringsoundFile);play(URLsoundURL);例如,play(getDocumentBase(),bark.au);语句将播放存放在与HTML文件相同目录的bark.au,一旦play()方法装载了该声音文件,就立即播放。如果找不到指定URL下的声音文件,play()方法不返回出错信息,只是听不到想听的声音而已。,声音加载和播放的一个示例,/文件名Ex10_5.java/假定存在sounds/sun.au,sounds与Ex10_5.class在同一个目录importjava.awt.Graphics;importjava.applet.applet;publicclassEx10_5extendsAppletpublicvoidpaint(Graphicsg)g.drawString(AudioTest,25,25);play(getDocumentBase(),sounds/sun.au);,例10.5一个简单的Audio测试以下的applet在appletviewer运行时中输出消息“AudioTest”,然后播放audio文件sounds/sun.au:,声音的加载和播放(续),由于play()方法只能将声音播放一遍,若想循环播放声音,就需要用到功能更强大的AudioClip类,它能更有效地管理声音的播放操作。因为它被定义在java.applet程序包中,所以需要在程序头部加上:importjava.applet.AudioClip;可以用与装入图像相同的方式装入audioclip(音频剪辑),将它们装载之后进行播放。为了装入一段audioclip,可使用来自java.applet.applet类的getAudioClip()方法,AudioClipsound;sound=getAudioClip(getDocumentBase(),bark.au);这个方法用来创建一个AudioClip对象,一旦创建就可以反复播放而无需重装音频文件。在AudioClip类中与AudioClip播放有关的方法有:play()、loop()和stop()。,声音的加载和播放示例2,/文件名Ex10_6.java/假定已存在sounds/sun.auimportjava.awt.Graphics;importjava.applet.*;publicclassEx10_6extendsAppletAudioClipsound;publicvoidinit()sound=getAudioClip(getDocumentBase(),sounds/sun.au);publicvoidpaint(Graphicsg)g.drawString(AudioTest,25,25);publicvoidstart()sound.loop();publicvoidstop()sound.stop();,声音的加载和播放示例2(续),sound.play();播放已装入的udioClip一遍。每次调用这个方法,audioclip会从头开始播放。sound.loop();循环(自动重放)播放audioclip。sound.stop();停止一段正在播放的audioclip。,程序分析:本例中在init()方法中加载需要播放的音乐文件,然后在start()方法中调用loop()方法,则将一段装入的audio自动循环播放,最后在stop()方法中调用类AudioClip的stop()方法停止播放audio。,动画的生成和播放,Java语言中的动画制作步骤是:第一步,在屏幕上显示动画的第一帧(也就是第一幅画面);第二步,每隔很短的时间再显示另外一帧,如此往复。具体的实现过程是系统去调用repaint()方法来完成重画任务,而repaint()方法又去直接调用update()方法。update()方法目的是先清除整个applet区域里的内容,然后再调用paint()方法,从而完成了一次重画工作。例10.7在applet中显示一行欢迎标题“Welcometohere!”,但要求这行标题一个字母一个字母跳出来,然后全部隐去,再重复刚才的打字效果。,动画的生成和播放示例,/文件名Ex10_7.javaimportjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;publicclassEx10_7extendsjava.applet.AppletStrings=WelcometoHere!;ints_length=s.length();/字符串长度intx_character=0;/显示到第几个字符FontwordFont=newFont(TimesRoman,Font.BOLD,50);publicvoidstart()while(true)if(x_character+s_length)x_character=1;repaint();tryThread.sleep(300);/暂停300毫秒catch(InterruptedExceptione),publicvoidpaint(Graphicsg)g.setFont(wordFont);g.setColor(Color.red);g.drawString(s.substring(0,x_character),8,50);,动画的生成和播放示例(续),程序分析:但是这个程序的运行结果并不是想要的结果,因为屏幕上一片空白,什么也没有。原因是程序中调用repaint()方法时,系统只是得到一个重画的请求,并不是立即去完成重画动作,而系统只能保证当它有空时,才能真正去执行repaint()方法中的代码,即调用update()和paint()方法进行真正的重画工作。但是在start()方法中用一个while无穷循环独占了系统资源,系统就没有机会去完成重画工作。同样的道理,本程序也不能正常结束,因为系统同样也没有机会去调用stop()方法。解决这个问题的方法就是引入多线程机制。,动画的生成和播放示例2,/文件名Ex10_8.javaimportjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;publicclassEx10_8extendsjava.applet.AppletimplementsRunnableThreadrunThread;Strings=Welcometohere!;ints_length=s.length()-1;intx_character=0;FontwordFont=newFont(TimesRoman,Font.BOLD,50);publicvoidstart()if(runThread=null)runThread=newThread(this);runThread.start();,publicvoidstop()if(runThread!=null)runThread.stop();runThread=null;publicvoidrun()while(true)if(x_character+s_length)x_character=0;repaint();tryThread.sleep(300);catch(InterruptedExceptione)publicvoidpaint(Graphicsg)g.setFont(wordFont);g.setColor(Color.red);g.drawString(s.substring(0,x_character),8,50);,动画的生成和播放示例2(续),程序分析:该程序实现Runnable接口来实现多线程,然后声明一个Thread类型的实例变量,该实例变量用来存放新的线程对象。其次覆盖start()方法,在start()方法中需要生成一个新线程并启动这个线程。再将原来start()方法中的主循环代码放入run()方法,也可以说run()方法中的代码才是这个applet真正的核心。最后覆盖stop()方法停止这一线程的运行。这里调用了Thread对象的stop()方法,就停止了该线程的运行,紧接着将这个Thread对象设为null,让系统把这个无用的Thread当作垃圾收集掉,释放内存。用户如果重新回到该Web页面,applet又会在start()方法中重新产生新的线程并启动它。这样就达到了预期的效果。,实例1,/文件名Ex10_9.javaimportjava.awt.*;importjava.awt.event.*;importjava.applet.Applet;publicclassEx10_9extendsAppletimplementsMouseListenerintmouseX=25;intmouseY=25;publicvoidinit()addMouseListener(this);publicvoidpaint(Graphicsg)g.drawString(HelloWorld!,mouseX,mouseY);publicvoidmousePressed(MouseEventevt)mouseX=evt.getX();mouseY=evt.getY();repaint();publicvoidmouseClicked(MouseEvente)publicvoidmouseEntered(MouseEvente)publicvoidmouseExited(MouseEvente)publicvoidmouseReleased(MouseEvente),例10.9在applet中鼠标点击的位置处显示“HelloWorld!”的字样。,实例2(续),publicvoidpaint(Graphicsg)g.drawString(HelloWorld!,mouseX,mouseY);publicvoidmousePressed(MouseEventevt)mouseX=evt.getX();mouseY=evt.getY();re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年金融行业数据分析师考试模拟题及参考答案
- 2025年法律顾问招聘面试模拟题及法律实务解答
- 2025年销售主管竞聘考试模拟题集及解析
- 申报校级品牌专业课件
- 管网维护管理制度
- 甲状腺学习课件
- 甲流病人护理课件
- 14课母鸡教学课件
- 办公室教学课件
- 黑龙江省鸡西市虎林市2024-2025学年七年级下学期期末语文试题(含答案)
- 医院各部门应急预案与流程图全集(2024版)
- 【《汽车前轴结构优化及轻量化性能研究(论文)》13000字】
- 水泥混凝土旧路面拆除施工方案
- 2025年健身教练专业试卷-健身教练职业资格认证考试复习指南
- 家政就业安置合同范本7篇
- 技术经纪人(初级)考试试题(附答案)
- 内审首次会议上的讲话
- 砖厂安全生产应急预案演练计划
- 老旧小区综合整治项目成品保护和工程保修的管理措施
- 西安26中小升初分班考试语文真题
- 2024年深圳技能大赛-电工职业技能竞赛理论考试题库-上(单选题)
评论
0/150
提交评论