510 likes | 684 Views
《Java 程序设计之网络编程 》. 教学课件. 重庆大学计算机学院 电子邮件: lizhx@126.com.
E N D
《Java程序设计之网络编程》 教学课件 重庆大学计算机学院 电子邮件:lizhx@126.com
Java应用程序可以分为三大类:Java Application、Java Applet以及Servlet。Java Application是可以独立运行的Java程序,我们在前面涉及的java程序大部分都是Java Application。相对于Java Application而言,Java Applet是不能独立运行,它只能嵌入到浏览器中运行。在HTML文件中,通过一个特定的HTML标签引用Java Applet程序,从而将Applet文件嵌入到网页文件中。当读者访问嵌有Applet的网页时,浏览器会自动从Web服务器上下载Applet程序,并在本机运行的Java虚拟机上运行。 第12章 Applet应用程序
主要内容: • 12.1 Applet程序设计基础 • 12.2 java.applet包 。 • 12.3 Applet中的多媒体应用 • 12.4 Applet中的鼠标和键盘事件
12.1 Applet程序设计基础 • 12.1.1加载Applet • Applet是Java语言的又一应用形式。它没有main方法,因而不能由解释器直接解释执行。 • 为了运行它,我们需要把它放进Web页面。当这个页面在浏览器上显示时,Applet就在页面中指定的一部分区域内显示其运行结果。
12.1.2 Applet的安全性限制 • Applet程序的执行需要从Internet上将Applet的伪代码下载到本地系统运行,因此Applet在给人们带来好处的同时,也带来了潜在的安全隐患。 • 为了防止这样的问题出现,在缺省的情况下,大多数浏览器在Applet安全方面受到诸多的限制,几乎不能对系统进行任何“读”或“写”的操作。
不允许Applet运行时执行另一程序。 • 不允许Applet访问本地文件系统。 • Applet不能执行任何本地计算机上的程序。 • 不允许Applet尝试打开除提供Applet的服务器之外的任何系统的Socket。 • 不允许Applet访问用户名、电子邮件地址等与本地系统有关的信息。 • 对于Applet而言,Java环境中的某些标准系统属性是只读的。
Applet不能创建或装载Applet的机器的网络连接。 • Applet不能充当网络服务器,监听或接收来自远程系统的连接请求。 • 不允许Applet装载动态库或定义本地方法调用。 • Applet不能操纵不在自己线程组中的任何线程。 • Applet不能关闭JVM。
12.1.3 Applet的生命周期 • Applet由运行时系统来构造。当它所在的页面被浏览器装入后,Applet就出生了。 • 这时系统自动调用init()方法,进行一些必要的初始化工作。 • 接着,系统将调用start()方法启动Applet的执行。 • 当浏览器切换到别的页面时,stop()被调用,以终止Applet的执行。
假如浏览器又切换回Applet所在页面,那么运行时系统将从调用start()方法开始Applet的又一次运行。假如浏览器又切换回Applet所在页面,那么运行时系统将从调用start()方法开始Applet的又一次运行。 • 当浏览器关掉时,Applet走到了它一生的终点。 • 系统将先调用stop()停止它的执行,然后用destroy( )方法来完成资源回收等收尾工作。 • 如果浏览器重载页面,就会先令Applet死亡(依次调用stop()和destroy()),然后装入页面(调用init()),开始Applet的又一次生命。
1.init() • 当applet被加载时,会首先执行init方法,该方法相当于Application程序中的main,该方法只能被执行一次。Applet可用这个方法来初始化数据的值,比如设置全局变量,初始化对象等等。该方法只在Applet首次装入时被调用,并且在调用start()之前执行完成。
2.start() • init方法执行完毕会就会自动执行start方法,start方法可以被反复执行,如一个applet被stop后,可以使用start方法重新开动。该方法的执行使得Applet成为“活动”的。无论Applet何时成为可见的,它同样要执行一次,如:当浏览器在被图标化后又恢复时,或者当浏览器在链接到另一个URL后又返回含有这个Applet的页面时。
3.stop() • stop方法是在Applet成为不可见时被调用。该方法在当用户不注意Applet的时候,停止一些资源的工作以免影响系统运行效率。比如:在浏览器被图标化或链接到另一个URL时,Applet会调用该方法使动画停止。
4.Destroy() • 当关闭包含Applet的浏览器窗口时,会调用该方法,以销毁Applet对象,释放对象占用的资源。
12.2 java.applet包 • 12.2.1 Applet类的继承关系 • Java.applet.Applet类实际上是java.awt.Panel的子类。
这种层次关系显示,一个Applet可直接用作一个AWT布局的起始点。因为Applet是Panel的子类,所以它有一个缺省的流(flow)布局管理器。这种层次关系显示,一个Applet可直接用作一个AWT布局的起始点。因为Applet是Panel的子类,所以它有一个缺省的流(flow)布局管理器。 • Component,Container和Panel类的方法被Applet类继承了下来。而与Panel不同的是,Applet类是一个可以运行的类,创建一个Applet类就相当于创建一个Applet应用程序。
12.2.2 Applet类的方法 1.有关运行环境和Applet状态的方法 • public AppletContext getAppletContext():用以得到与Applet有关的上下文(AppletContext)对象。此方法与访问Applet的执行环境有关。 • public void resize(int width,int height):重新设置Applet所在区域的大小。该方法重写了Component类的resize()方法。它还有一个重载方法。 • public void showStatus(String msg):用Applet的上下文(如执行它的浏览器)来显示Applet的状态信息。
public final void setStub(Applet Stub):用来设置与Applet相关的“存根”AppletStub。除非你要构造自己的Applet浏览器,否则不要使用它。由final修饰符可知这个方法是不可重写的。 • public Locale getLocale():Local是java.util包中的一个类,封装与国家、语言等相等的地域信息。这个方法用于获取与Appet相关的Locale对象。 • public boolean isActive():判断Applet是否处于被激活的状态。
2.用于操作声音、图像资源的方法 • public Image getImage(URL url):从给定的URL获取Image对象,用以处理图像。 • public Image getImage(URL url,String name) 获取指定URL和名字的Image对象。 • public AudioClip getAudioClip(URL url):从给定的URL获取AudioClip对象。
public AudioClip getAudioClip(URL url,String name):获取指定URL和名字的AudioClip对象,这两个方法用以处理声音。 • public void play(URL url):用于演奏指定URL的AudioClip对象。 • public void play(URL url,String name):用于演奏指定URL和名称的AudioClip对象。
3.与生命周期有关的方法 • public void init():做初始化工作,在Applet被装入时调用。 • public void start():启动Applet的运行。 • public void stop():停止Applet运行时被自动调用。 • public void destroy():当Applet消亡时被自动调用,一般用来做回收资源等收尾工作。
4.与Applet所在页面有关的方法 • public URL getCodeBase():返回Applet所在的文档的URL。 • public URL getDocumentBase():返回Applet所在的HTML文档的URL。 • public String getAppletInfo():返回一个String对象,其中包含Applet的版。本,拷贝权、作者等信息。 • public String[][] getParameterInfo():描述Applet参数的名字、类型和描述 • public String getParameter(String):得到在HTML文档中传给Applet的参数。
12.2.4 HTML和Applet <applet [archive= archiveList] code= appletFile. class width= pixels height= pixels [codebase= codebaseURL ] [alt= alternateText ] [nam e= appletInstanceName ] [alig n= alignment ] [vspace = pixels ] [hspace= pixels ] > [<param name= appletAttribute1 value= value >] [<param name= appletAttribute2 value= value >] …… [alternateHTML] </applet>
archive = archiveList • code = appletFile.class • width = pixels height = pixels • codebase = codebaseURL • alt = alternateText • name = appletInstanceName • align = alignment • vspace = pixels hspace = pixels • <param name = appletAttribute1 value = value>
【例12-1】HelloWord程序 HTML源文件: <HTML> <applet code="helloworld.class" width=400 height=150 codebase=”./applet”> <param name=size value=40> <param name=color value=008800> </APPLET> </HTML>
Applet源程序 import java.awt.*; import java.applet.*; public class helloworld extends Applet { private String title; private int size; private int color; public void init() { title="Hello World!"; size=Integer.parseInt(getParameter("size")); //获得字体大小 color=Integer.parseInt(getParameter("color")); //获得字体颜色 } public void paint(Graphics g) { Color c=new Color(color); g.setColor(c); Font f=new Font("",1,size); g.setFont(f); g.drawString(title,100,80); } }
12.2.4 Appletviewer • 为了简化和加速开发过程,JDK附带了一个专为查看Applet而设计但不支持HTML页面查看的工具。这个工具就是Appletviewer,它使你不必使用Web浏览器即可运行Applet的一个Java应用程序。
12.2.5 Applet的显示 • 除了基本的生命周期外,Applet还有与其显示有关的一些重要的方法,包括:paint()、repaint()和update()方法。这些方法是Applet显示和刷新的重要工具,它们的声明和文档在AWT组件类中。Applet的更新显示都是由AWT线程来独立控制完成。
12.3 Applet中的多媒体应用 • 12.3.1URL • URL(Uniform Resoure Locator:统一资源定位器)是Internet上各种资源的定位地址。在Java语言中URL类封装了多个URL,一般有两种方法创建一个URL对象: • URL u=new URL(“http://java.sun.com/index.html”); • URL data=new URL(u,”data/planets.dat”);
第一种方法向URL构造器传递一个字符串,且指定了整个资源的名称,因此称为绝对URL。第二种方法可以产生相对URL,它指定的planets.dat文件位于URL对象u的data子目录中。第一种方法向URL构造器传递一个字符串,且指定了整个资源的名称,因此称为绝对URL。第二种方法可以产生相对URL,它指定的planets.dat文件位于URL对象u的data子目录中。 • 在Applet类中有两个方法可以获得对象的URL: • public URL getCodeBase():返回Applet所在的文档的URL。 • public URL getDocumentBase():返回Applet所在的HTML文档的URL。
12.3.2加载图像 • Applet类中,加载图像文件的方法有两个: • public Image getImage(URL url):从给定的URL获取Image对象,用以处理图像。 • public Image getImage(URL url, String name) 获取指定URL和名字的Image对象。
Graphics类中显示图像文件的方法也有两个: • drawImage(Image img, int x, int y, ImageObserver obs):在指定的位置显示图像对象img。 • drawImage(Image img, int x, int y, int width, int height, ImageObserver obs):将图像对象img缩小或放大到指定大小,并在指定位置显示图像。
【例12-2】加载并显示图像 Applet源程序 import java.awt.*; import java.applet.*; public class display_image extends Applet { Image labmag; public void init() { labmag=getImage(getDocumentBase(),"image.jpg"); } public void paint(Graphics g) { g.drawImage (labmag,0,0,this); g.drawImage (labmag,0,150,200,100,this); } }
HTML源程序 • <HTML> • <applet code= display_image.class width=600 height=250 > • </applet> • </HTML>
12.3.3播放声音 • 播放一段声音文件的最简单的方式是通过Applet的play方法: • public void play(URL url):用于演奏指定URL的AudioClip对象。 • public void play(URL url,String name):用于演奏指定URL和名称的AudioClip对象。
【例12-3】用play方法播放声音文件 import java.awt.Graphics; import java.applet.Applet; public class play_audio extends Applet { public void paint(Graphics g) { g.drawString("Audio Test", 25, 25); play(getDocumentBase(),"audio.wav"); } }
AudioClip类 • 1)装入一段Audio Clip • 要转载一个声音文件,必须先通过指定的声音文件生成一个AudioClip对象。在Applet中有两种方法可以获取声音文件并生成一个AudioClip对象: • public AudioClip getAudioClip(URL url):从给定的URL获取AudioClip对象。 • public AudioClip getAudioClip(URL url,String name):获取指定URL和名字的AudioClip对象,这两个方法用以处理声音。
2)播放AudioClip对象 • 一旦一段clip被装载,可选择与之相关的三个方法之一:play,loop,或stop • play():将已装入的AudioClip对象播放一遍。 • loop():启动AudioClip对象的播放并不断循环(自动重放)。 • stop()
【例12-4】循环播放声音 import java.awt.Graphics; import java.applet.*; public class loop_audio extends Applet { AudioClip sound; public void init() {sound = getAudioClip(getDocumentBase(), "audio.wav"); } public void paint(Graphics g) { g.drawString("Loop Audio Test", 25, 25); } public void start() { sound.loop(); } public void stop() { sound.stop(); } }
12.5 Applet编程实例【例12-8】一个通过Applet显示时钟的例子 import java.awt.*; import java.applet.*; import java.util.Date; //这是Java中的低级实用工具包,可以处理时间等内容。 public class display_clock extends Applet implements Runnable //有线程运行接口 { Date timenow; //Date是一个时间定义与创建函数. Clock myClock; //用户自定义的类 Thread clockthread=null; //设置一个线程 public void start() //线程开始的类 {if (clockthread==null) //如果线程为空,则 {clockthread=new Thread (this); //开始新的线程 clockthread.start(); //开始}}
public void stop() //终止线程 { clockthread.stop(); //终止线程,使它 clockthread=null; //为空} public void run() //运行线程 {while(true) //一个死循环,条件永远都是真的。 {repaint(); //重新绘制界面 try{Thread.sleep(1000);} //让线程沉睡1000毫秒,也就是一秒钟 catch(InterruptedException e){} //捕获异常(也就是错误)}} public void paint(Graphics g) { timenow=new Date(); //新的时间的获得 //获得小时,分钟,秒钟 myClock=new Clock(timenow.getHours (), timenow.getMinutes (), timenow.getSeconds ()); g.drawString(timenow.toString(),25,240);//将它打印出来! myClock.show(g,100,100,100); //使面板显示} }
class Clock //用户自定义的类开始,编译后,它单独成为一个CLASS文件 {Clock(int hrs,int min,int sec) //类函数入口 { hour=hrs%12; //将原始数据处理,得到小时 minute=min; //将原始数据处理,得到分钟 second=sec; //将原始数据处理,得到小时} void show(Graphics g,int cx,int cy,int rad) //重新定义SHOW函数 {int hrs_len=(int)(rad*0.5), //时针的长度 min_len=(int)(rad*0.6), //分钟的长度 sec_len=(int)(rad*0.9); //秒钟的长度 double theta; //画出钟面 g.drawOval(cx-rad,cy-rad,rad*2,rad*2);//画出时针 theta=(double)(hour*60*60+minute*60+second)/43200.0*2.0*Math.PI ; drawNiddle(g,Color.blue,cx,cy,hrs_len,theta); //画出分针 theta=(double)(minute*60+second)/3600.0*2.0*Math.PI ; drawNiddle(g,Color.red,cx,cy,sec_len,theta); //画出秒针 theta=(double)(second)/60.0*2.0*Math.PI ; drawNiddle(g,Color.green ,cx,cy,sec_len,theta);}
private void drawNiddle(Graphics g,Color c,int x,int y,int len,double theta) { int ex=(int)(x+len*Math.sin(theta)); int ey=(int)(y-len*Math.cos(theta)); g.setColor (c); g.drawLine(x,y,ex,ey); } int hour,minute,second;}}
【例12-9】使用Applet和Graphics,实现一个文字的移动广告【例12-9】使用Applet和Graphics,实现一个文字的移动广告 import java.awt.*; import java.applet.*; public class ShadowText extends Applet implements Runnable { private Image img; private Image offI; private Graphics offG; private Thread thread = null; private int height,width; private String text; private int FontSize; private Font font; private int textcolor, backcolor, shadowcolor;
public void init() { width = this.size().width; height = this.size().height; //获取显示信息 String s = new String(getParameter("Text")); text = new String("Hello"); if(s != null) text = s; //获取字体大小 FontSize = 30; s = new String(getParameter("FontSize")); if(s != null) FontSize = Integer.parseInt(s); //获得字体颜色 s = getParameter("Fore"); textcolor = (s==null) ? 0x000000 : Integer.parseInt(s, 16); //获取背景颜色 s = getParameter("Back"); backcolor = (s==null) ? 0x000000 : Integer.parseInt(s, 16); //获取阴影颜色 s = getParameter("shadow"); shadowcolor = (s==null) ? 0x000000 : Integer.parseInt(s, 16); //设置背景颜色 this.setBackground(new Color(backcolor)); //使用Graphics创建一张图片 img = createImage(width+300,height); Graphics temp = img.getGraphics(); temp.setColor(new Color(backcolor));
temp.fillRect(0,0,width,height); temp.setColor(new Color(shadowcolor)); font = new Font("TimesRoman",Font.BOLD,FontSize); temp.setFont(font); temp.drawString(text,10,height*3/4); temp.setColor(new Color(textcolor)); temp.drawString(text,10-3,height*3/4 - 3);//构造可控制的图片对象 offI = createImage(width,height); offG = offI.getGraphics(); } //重载start()方法,启动线程 public void start() { if(thread == null) { thread = new Thread(this); thread.start(); } } //绘制屏幕的线程体 public void run() { int x=width; while(thread != null) { try { offG.drawImage(img,x,0,this); repaint(); thread.sleep(20); }
catch(InterruptedException e){} x-=3; if(x < -img.getWidth(this)) { x = width; } } } //方法说明:Appletg更新画面调用的方法 public void update(Graphics g) { paint(g); } // Applet绘制屏幕的方法 public void paint(Graphics g) { g.drawImage(offI,0,0,this); } }
【例12-10】用Applet显示一个钢琴键盘,并能通过鼠标点击不同的按键发出相应的声音。【例12-10】用Applet显示一个钢琴键盘,并能通过鼠标点击不同的按键发出相应的声音。 import java.applet.*; import java.awt.*; //绘制钢琴键盘,每一个对象代表键盘上的一个按键 class Keyboard extends Canvas { Keyboard(Color c, AudioClip k) { keyColor = Color.white; keyColor = c; setBackground(keyColor); key = k; width = getSize().width; height = getSize().height; }
public void paint(Graphics g) { width = getSize().width; height = getSize().height; g.setColor(Color.black); g.drawRect(0, 0, width - 1, height - 1); } public boolean mouseDown(Event event, int x, int y) { key.play(); return true; } Color keyColor; AudioClip key; int width; int height; } public class Piano extends Applet { public Piano() { } public void init() { setLayout(null); width = size().width; height = size().height; key = new Keyboard[12]; sound = new AudioClip[12]; String s = new String(""); //载入12个钢琴按键对应的声音文件 for(int i = 0; i < 12; i++) { s = i + ".au"; System.out.println(s);sound[i] = getAudioClip(getCodeBase(), s); }