2020/1/161第9章小应用程序(Applet)2020/1/162本章总体纲要•小应用程序•小应用程序HTML标记符•同时是应用程序和小应用程序2020/1/163小应用程序•什么是小应用程序?•类的层次结构•JApplet与Applet之间的不同点•小应用程序的生命周期•小应用程序的安全性2020/1/164什么是小应用程序?•小应用程序是可以嵌入到HTML(HypertextMarkupLanguage)文件中运行的Java程序–一般是java.applet.Applet(或javax.swing.JApplet)的子类–通过appletviewer或HTML浏览器运行2020/1/165类的层次结构java.lang.Object|+--java.awt.Component|+--java.awt.Container|+--java.awt.Panel|+--java.applet.Applet|+--javax.swing.JApplet2020/1/166JApplet与Applet之间的不同点•类JApplet是类java.applet.Applet的子类•类JApplet与Swing组件配套•默认的布局方式不同–JAppletBorderLayout.–AppletFlowLayout.•往容器JApplet中添加组件必须通过contentPane–例如:给小应用程序添加组件•使用Applet,代码如下:applet.add(child);•使用Japplet,代码如下:japplet.getContentPane().add(child);2020/1/167小应用程序的生命周期•所有的小应用程序具有如下的四个成员方法:–publicvoidinit():在小应用程序的生命周期中只会被调用一次,而且是在第一次加载小应用程序时–publicvoidstart():当小应用程序在启动或重新启动时,会调用此方法–publicvoidstop():当小应用程序被图标化或从当前网页转到其它网页时,会调用此方法–publicvoiddestroy():在小应用程序的生命周期中只会被调用一次,而且是在(关闭网页之前)卸载小应用程序时2020/1/168小应用程序的生命周期初始化状态(瞬时)运行状态停止状态死亡状态start复原或重新进入该网页startstop关闭浏览器destroy第一次加载建构init图标化或进入新的网页2020/1/169小应用程序的安全性——可以做什么?•在网页上画图•创建新的窗口,并画该窗口•播放声音•接收键盘或鼠标的输入•进行网络连接2020/1/1610小应用程序的安全性——不可以做什么?•未经许可,在主机的硬盘上写数据•未经许可,在主机的硬盘上读取数据•未经许可,删除文件•未经许可,直接调用本机的API•读/写内存中未经许可的数据•通过网络连接到未经授权的主机2020/1/1611本章总体纲要•小应用程序•小应用程序HTML标记符•同时是应用程序和小应用程序2020/1/1612小应用程序HTML标记符•标记符Code和codebase•JAR压缩文档和标记符ARCHIVE•给小应用程序传递参数2020/1/1613标记符Code和Codebase•标记符CODE用来指定小应用程序所对应的“.class”文件•标记符CODEBASE用来指定URL(网络资源定位器)标明“.class”所在的位置/路径•示例1:APPLETCODE=J_Clock.classcodebase=..\..\a005ClockWIDTH=200HEIGHT=200/APPLET•示例2:APPLETCODE=J_Clock.classcodebase=~junhai/java/WIDTH=200HEIGHT=200/APPLET2020/1/1614JAR压缩文档和标记符ARCHIVE•将小应用程序所需要的所有图像、声音以及“.class”文件压缩成一个JAR压缩文档•一般可以大大减少加载小应用程序的时间–每个文件加载需要独立的HTTP连接–许多文件许多次连接–许多文件组成一个文件一次连接–数据被压缩减少数据本身的传输时间2020/1/1615示例:(ARCHIVE)javac*.javajar-cvfall.jar*.class!---------AppletExample.html开发者:雍俊海---------HTMLHEADTITLEAnappletExample/TITLE/HEADBODYAPPLETcode=J_MainCircle.classARCHIVE=all.jar”WIDTH=300HEIGHT=100/APPLETPAPPLETcode=J_StaticClock.classARCHIVE=all.jar”WIDTH=200HEIGHT=200/APPLETPAPPLETcode=J_Clock.classARCHIVE=all.jar”WIDTH=200HEIGHT=200/APPLET/BODY/HTML命令AppletExample.html2020/1/1616给小应用程序传递参数•给小应用程序传递参数,在HTML文件中PARAMNAME=nameVALUE=value–介于APPLET...和/APPLET之间•给小应用程序传递参数,在程序代码中publicStringgetParameter(Stringname)–类java.applet.Applet的成员方法2020/1/1617标记符ALT•HTML语句APPLET具有ALT属性–当HTML浏览器不支持小应用程序时,可以显示ALT中的文本信息•实例:APPLETCODE=J_Clock.classALT=Ifyourbrowsersupportsapplets,you'dseearunningclock.WIDTH=200HEIGHT=200/APPLET2020/1/1618示例:J_Applet.javaimportjava.awt.*;importjavax.swing.*;publicclassJ_AppletextendsJApplet{publicvoidpaint(Graphicsg){Strings=getParameter(TestPara);g.drawString(Valueof\TestPara\is+s+.,10,50);}//方法paint结束}//类J_Applet结束!---------AppletExample.html开发者:雍俊海---------HTMLHEADTITLEAnappletExample/TITLE/HEADBODYAPPLETCODE=J_Applet.classWIDTH=280HEIGHT=140PARAMNAME=TestParaVALUE=TestValue/APPLET/BODY/HTMLValueofTestParaisTestValue.J_Applet.javaAppletExample.html程序输出2020/1/1619本章总体纲要•小应用程序•小应用程序HTML标记符•同时是应用程序和小应用程序2020/1/1620既是应用程序,又是小应用程序•可以编写一个程序,它既是应用程序,又是小应用程序。单个“.class”文件既可以按应用程序执行,又可以按小应用程序执行2020/1/1621本章小结•小应用程序•小应用程序HTML标记符•同时是应用程序和小应用程序2020/1/1622示例:J_List.java//J_List.java;开发者:雍俊海//同时是应用程序与小应用程序的图像显示例程importjava.awt.BorderLayout;importjava.awt.Container;importjava.awt.Image;importjava.io.File;importjavax.imageio.ImageIO;importjavax.swing.event.ListSelectionEvent;importjavax.swing.event.ListSelectionListener;importjavax.swing.Icon;importjavax.swing.ImageIcon;importjavax.swing.JApplet;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JList;publicclassJ_ListextendsJApplet{privateStringm_items[]={snow.gif,flag.gif,rain.gif};privateJListm_list=newJList(m_items);privateJLabelm_label=newJLabel();privateIconm_icons[]=newImageIcon[3];privateImagem_image[]=null;Containerm_container=null;2020/1/1623示例:J_List.javapublicvoidinit(){inti;if(m_image==null){m_image=newImage[3];for(i=0;i3;i++)m_image[i]=getImage(getCodeBase(),m_items[i]);}//if结构结束for(i=0;i3;i++)m_icons[i]=newImageIcon(m_image[i]);if(m_container==null)m_container=getContentPane();m_container.setLayout(newBorderLayout());m_container.add(m_list,BorderLayout.WEST);m_list.setSelectedIndex(0);m_list.addListSelectionListener(newListSelectionListener(){publicvoidvalueChanged(ListSelectionEvente){ints=m_list.getAnchorSelectionIndex();m_label.setIcon(m_icons[s]);}//方法valueChanged结束}//实现接口ListSelectionListener的内部类结束);//addListSelectionListener方法调用结束2020/1/1624示例:J_List.javam_container.add(m_label,BorderLayout.EAST);m_label.setIcon(m_icons[0]);}//方法init结束publicstaticvoidmain(Stringargs[]){JFramef=newJFrame(应用程序);J_Listapp=newJ_List();app.m_container=f.getContentPane();app.m_image=newImage[3];try{for(inti=0;i3;i++)app.m_image[i]=ImageIO.read(newFile(app.m_items[i]));}catch(Exceptione){System.err.println(发生异常:+e);e.printStackTrace();}//try-catch结构结束app.init();f.setSize(250,110);f.setVisible(true