还剩13页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
习题十五参考答案
15.1什么是Applet程序,它有什么特点?Applet也被称为小应用程序,它没有main方法,是一种必须在浏览器中运行的Java程序它可以实现让Internet动起来”的效果,它可以通过访问网络服务器在网络中传播与下载,还可以作为Web文档运行为了保证系统安全,当用户在客户端下载相关的程序后,浏览器会限制其访问本地资源
15.2Applet与Application程序的工作原理有什么不同?Application和Applet的【X别主要在于执行方式的不同(表15-1)Application以main()方法作为程序执行的入口在虚拟机中独立运行,它的结果取决于代码的内容与结构Applet本身不能直接运行,必须嵌入到-个支持HTML(HyperText MarkupLanuage,超文本标记语言)网页文件中的浏览器中,由浏览器加载执行Applet也可以使用Applctvicwcr运行它必须嵌入,通过此代码通知浏览器如何运行程序
15.3Applet处理问题的基本流程是什么?Java提供了Java.applet.Applet类,用于处理与Applet相关的运行,因此在编写Applet程序的时候,必须使用import加载这个类,然后再定义一个类继承Applet类,并将相关的程序编写在这个类中Appletviewer与Applet的类继承关系如图15-3所示,Appier类除了拥有自己的方法,它同时还继承了父类(Panel类)的所有方法Applet类是public类,它只有一种形式的构造方法public AppletO,用F创建一个Applet类的实例,Applet从建立到执行分成以下四个环节
①用Java语言编写一个Applet源程序
②将Applet源程序编译成字节码(class文件)
③将字节码文件嵌入到WEB页面中
④用支持Java的浏览器运行、浏览
15.4Applet如何实现文字、图形、图像的输出?处理文字效果public synchronized static booleanYeadyAmmo{〃判断了•弹是否够用synchronized ammoNum{return annnoNuin0;public static void mainStringargs[]{//main方法启动EventQueue.invokeLaternew Rimnable{//是java.awt中的类public voidnm MainFrame frame=new MainFraine;frarne.setVisiblef true;frame.start;}catch Exceptione{e.printStackTrace;I I I;}public void启动游戏的方法new MouseThread.start;I privatefinal classFrameMouxeListener extendsMouseAdapter{〃窗体的鼠标事件监听器public voidmousePressedtfinal MouseEvente{Component at=backgivundPanel.getComponentA te.getPoint;if atinstanceof BackgroundPanel{//如果点到面板也扣除子弹MainFrame.iiseAmmo;//消耗了•弹class MouseThreadextends Thread/〃生成运动角色的线程public void run{while true{Mouse LabelMouse=new MouseLabel;//创建代表运动角色的标签控件Mouse.setSize161,142;//设置控件初始大小backgroitndPanel.addMouse;//添加控件到背景面板try{sleeplong random*3000+500;//线程随机休眠-段时间catch InterruptedExcept ione{e.printStackTrace;
15.7简述使用AudioClip类编写声音处理程序的步骤下列代码行举例说明加载声音文件进入剪贴对象AudioClip co=gctAudioClipgcCodcBase,horns.wav;getAudioClipO方法仅仅能被applet内调用随着Java2的引入,应用程序也能用Applet类的newAudioClip方法装入声音义件前一例子可以改写如下以用「Java应用程序AudioClip co=newAudioClipChorns.wav;在创建AudioClip对象之后,可用该对象调用play、loop以及stop方法假如getAudioClip或newAudioClip方法不能找到指定的声音文件,AudioClip对象的值将是空的在播放空对象会导致出错,所以标准的过程首先是对该条件进行检测
15.8简述图形、图像和动画之间的区别与联系图形为了实现特定的技术要求,通过计算机中的算法生成的图案,它是矢量效果,放大后不失真;图像为了研究外部世界的内容,通过数字化采样方式将外部世界信息转换为数字文件,它的特点是使用像素描述,放大会失真动画根据人眼的视觉盲点原理实现的当一系列的图形图像以30帧/s以上的速度快速切换时,人眼看到的是动画效果而且能保证动作的连续性,不会造成跳动的感觉动画播放速率越高,所呈现的动作越细腻
15.9分析Graphics和Image类的联系,简述paint等主要方法使用Graphics类是所有图形上下文的抽象基类,允许应用程序在组件己经在各种设备上实现以及闭屏图像上进行绘制Graphics对象封装了Java支持的基本呈现操作所需的状态信息抽象类Image是表示图形图像的所有类的超类必须以特定于平台的方式获取图像Ipaint方法|public void paintGraphics g绘制容器该方法将paint转发给任意一个此容器了组件的轻量级组件如果重新实现此方法,那么应该调用super.paintg方法,从而可以正确地呈现轻量级组件如果通过g中的当前剪切设置完全剪切某个子组件,则不会将paint转发给这个子组件覆盖类Componeni中的paint参数g-指定的Graphics窗口update方法:public voidupdateGraphics g更新容器该方法将叩date方法转发给任意、•个此容器了•组件的轻量级组件如果重新实现此方法,那么应该调用super.updateg方法,从而可以正确地呈现轻量级组件如果通过g中的当前剪切设置完全剪切某个子组件,则不会将update转发给这个子组件覆盖类Component中的update参数g-指定的Graphics窗口Repaint方函:public voidrepaint重绘此组件如果此组件是轻量级组件,则此方法会尽快调用此组件的paint方法否则此方法会尽快调用此组件的update方法
15.10编写一个字符串循环滚动的程序从窗体左侧进入,从右侧移出,而后又从左侧移入import java.awt.*;import java.awt.event.*;public classFlowChar extendsFrame{int x=100,y=50;〃设置成变量才能实现动画效果public voidpaintGraphics g{g.drawStmg”移动字符串演示文件效果“,x,y;〃将画图画笔传递到对象中x=x+I0;ifx800x=-100;}public voidlauchFrame{lhis.setLocation400,200;this.setSize800,600;this.setTitle”字符飘浮效果this.addWindowListenernew WindowAdapter{public voidwiniowClosingWindowEvent eSystem.exitO}I;th is.setResizableJa Ise;this.setBackgroundi Color.GREEN;setVisibletrue;new ThreadQiewPaimThreadgstart;〃启用多线程进行动画的控制I public staticvoidmainString[/args{FlowCharfc=new FlowChar;fc.lauchFrame;}private classPaintThread implementsRunnable{public voidrunwhi leftrue Irepain心;〃调用它实现重新绘图的效果tryl Thread.sleepf100;〃实现了连续动画,否则飞起来了catch InterruptedExcept ione〃使用Sleep有异常抛出问题e.pnntSlackTrace;import Java.awt.*;import Ja va.applet.Applet;public classApplet jextextends Applet{public voidpaintGrap/iics gf g.drawSlring”太原理工大学”,30,50;//在绘图区内写上字符串}}实现图形效果import Java.awt.*;import Java.applet.Applet;public classApplet_Shape extendsApplet{public voidpaintGraphics g{^.drawArcf int x,int y,int width,int height,int startAngle,int arcAn^le;}}实现图像效果import Java.awt.*;import Java.applet.Applet;public classApplet_hnage extendsApplet{public voidpaintGraphics g{g.cbawlmagefImage img,intx,int y,Color bgcolor,InuigeObserve矿observer;
15.5什么是双缓冲技术,它解决了什么问题?在生成动画文件的时候,程序首先自动调用重载后的paintGraphics g方法,该线程每隔-段时间修改•下位置,然后调用repaint方法repaint方法是从Frame类继承而来的它先调用updateGraphics g方法,updateGraphics g再调用paintGraphics g方法这样会导致图像还没有完全显示就又被更新,画面出现闪烁感觉双缓冲就是在内存中开辟一片区域,作为后台图像,程序先对它进行更新、修改,绘制完成后再一次性显示到屏幕上这种方法要求将双缓冲的处理放在painiGraphics g方法中
15.6通过本章节的学习,设计一个小游戏实现随机位置出现图案,用鼠标点击后消失,并能够统计点击成功次数本题目属于典型的综合设计,使用到简单的PS技术提前通过网络选择合适的图片下载本案例中使用1024*768的背景图片,目标图片使用161*142图片程序通过MainFrame.java启动,背景由BackgroundPanel.java控制,图片由PigLabeLjava控制可以根据设计内容的需要,增加其他的目标对象控制O背景图片(1024*768*16M,JPG格式)161*142,16M JPG格式161*142,256色GIF格式BackgroundPanel.java import java.awt.Graphics;import java.awt.Image;import javax.swing.JPanel;public classBackgroundPanel extendsJ Panel〃背景面板private Imageimage;//背景图片public BackgroundPane1setOpaquetfalse;setLayoutnull;1public voidseihmigelinage image{this.image=image;I protectedvoidpain〔ComponemGraphics g{〃画出背景if image!=null{int width=getWidth;//图片宽度hit height=getHeight;//图片高度g.drawlmageimage,0,0,width,height,this;//画出图片}super paintComponentg;}}MouseLabel.java import java.awt.Container;import java.awt.event.*;import javax.swing.*;public classMouseLabel extendsJLcibel implementsRunnable{private intsleepTime=1000;private inty=157+int460random;//控件的垂直坐标private intscore=10;//该角色对应的分数private Threadthread;//内置线程对象private Containerparent;//控件的父容器对象public MouseLabel{〃对象构造方法superf;bnagelcon icon=new ImageIcongetClass.getResource mouse.gif;//swing类包中,加载对象图片setlconicon;//设置本组件的图标addMouseListenernew MouseAdapterf{//添加鼠标事件适配器public voidmousePressedtfinal MouseEvente{//按下鼠标按键的处理方法if!MainFrame.readyAmmo return;Main Frame.useAmtno;//消耗子弹appScore;//给游戏加分destoryO;//销毁本组件II;addCoinponentListenernew ComponentAdapter{//添加组件件适配器public voidcomponent Resized finaI ComponentEvente{//调整组件大小时thread.start//启动线程J;thread=new Threadthis;//初始化线程对象I public voidrun/parent=null;int width=0;while width=0\\parent==null{//获取父容器宽度if parent==null parent=getParent;else width=parent.getWidth;}setLocationint800*Math.random,y;try!Thread.sleepsleepHme;//休眠片刻catch InterruptedExceptione{e.printStackTrace;}if parent!=null{MainFrame.appScore-score*10;//自然销毁将扣分I destoryO;}public voiddesicryO{〃从容器移除本组件的方法if parent==null return;parent.remove this;parent.repaint;parent=null;//通过该语句终止线程循环private voidappScoreR I〃加分的方法MainFrame.appScore10;}I MainFrame.java importstatic java.lang.Math,random;〃引用随机功能控制动态变化效果importjava.awt.字;〃引入图形界面功能importjava.awt.event.〃事件控制import javax.swing.株;〃使用swing的功能public classMain Frameextends JFrame{private staticlong score=0;//分数private staticInteger aminoNum=10;//子弹数量private staticJLabel scoreLabel;//分数private BackgroitndPanelbackg roundPane I;private staticJLabel anunoLabel;private staticJ Panelinfo Pane;public staticfinal intGAME_W!DTH=1024;public staticfinal intGAME_HEIGHT=768;public staticfinal intGAME_TOP=100;publicstaticfinal intGAME_LEFT=100;public MainFrameQ{〃构造方法super;setResizablefalse;〃禁止调整窗体大小setTitleJava语言程序设计综合练习infoPane=JPanel getGlassPane;//获取玻璃面板J Labellabel=new JLabel”装载子弹……;//创建提示标签组件label.setHonzontalAli^nmentSwingConstants.CENTER;label.setFoninew Font楷体”,Font.BOLD,32;label.setForegroundColor.RED;infoPane.setLayoutnew BorderLayout;info Pane.add label;//添加提示标签组件到玻璃面板set AIwaysOn Toptrue;//是窗体保持在最顶层setBoundsGAME_TOP,GAME_LEFT,GAME_WIDTH,GAMEJiElGHT;〃具体数据取决于背景图片的大小,100,100是相对而言窗体的位置selDejhi山CUseOpera〔ionJ Frame.EX1T_ON_CLOSE;〃设置窗体关闭功能backgroundPanel=new BackgroundPanel;//创建带背景的面板backgroundPanel.setlmagenevv ImageIcongetClass.getResource back.jpg.getbnage;//设置背景图片getContentPane.addbackgroundPanel,BorderLayout.CENTER;//添加鼠标事件适配器uddMouseListenernew FrameMouseL代lener;//增加鼠标监听功能scoreLabel=new JLabe1;//显示分数的标签组件scoreLabel.setHorizontalA lignmentSwingConstants.CENTER;scoreLabel.set Foreground Color.ORANGE;scoreLabel.setBackground Color.WHITE;scoreLabel.setText分数:;scoreLabel.setBounds25t15,120,18;backgmundPanel.addscoreLcibel;ammoLabel=new JLabel;//显示自动数量的标签组件ammo LabeI.set ForegroundColor.ORANGE;ammoLabel.setHorizontalAlignment SwingConstants.RIGHT;cimmoLabel.setTexK”子弹数昂::+ammo Num;ammLabel.setBounds60,15,93,18;backg roundPanel.add ammoLabel;I publicsynchronized staticvoid appScoreintnum,〃统计成绩score+=num;scoreLabel.setTexK分数:+score;I publicsynchronizedstaticvoid useAmmo{//统计子弹消耗synchronized ammoNum{atnmoNum-;//子弹数最递减ammolxibel,setTexK”子弹数蜜:+ammo Num;if ammoNiun=0///判断子弹是否小于0new Thread newRunnablef{publicvoidrun{infoPane.setVisibletrue;//显示提示信息面板try Thread.sleepUO;//1秒钟装载子弹的时间}catch InterruptedExceptionefe.pnntStackTrace;}ammoNiun=10;//恢复子弹数量ammcLabeLseiTexK子弹数*ammcNum;//修改子弹数量标签的文本infoPane.setVisiblefalse;//隐藏提示信息面板。