Applet程序设计

5.1 Applet概述

Applet是可以再Web浏览器上运行的小型Java程序,它可以运行在支持Java的浏览器中,例如IE和Netscape等,使用Applet可以大幅度提高网页的交互能力。

当用户访问网页中包含Applet程序时,Applet将被下载到本机执行,一个包含Applet程序的HTML网页可以实现添加声音、动画、游戏等特性到网页中,从而吸引网站浏览者,增加网站流量。

Applet类的层次关系

Applet类继承了Panel类,是一个容器,在Applet程序开发中多使用JApplet类,它是Java Swing中的成员,继承了Applet类,JApplet类的继承关系如下图所示。

  

JApplet和Java Swing中的JFrame窗体类似,可以容纳各种组件,例如按钮、标签、列表框、文本框等。

简单Applet实例

(1) 创建HelloApplet类,该类必须继承JApplet类,并且覆盖父类的init()方法。

代码:

import java.awt.Container;
import javax.swing.JApplet;
import javax.swing.JLabel;
public class HelloApplet extends JApplet{
   public void init() {
       Container c=getContentPane();
       JLabel l=new JLabel("HelloWorld");
       add(l);    }
}

(2)编写“HelloApplet.html”文件,在该文件中使用<Applet>标签装载Applet程序。

代码:

<html>
   <body>
    <Applet code=“HelloApplet.class” width=200 height=100>
    </Applet>
  </body>
</html>

使用appletviewer.exe执行Applet

例如:

……>appletviewerHelloApplet.html

注意:

(1)字节码文件(class文件),网页文件要放在同一个文件夹中。

(2)运行的当前目录为网页所在的目录。

Applet生命周期

Applet程序没有main()方法,它是在init()方法中创建并使用组件的。Applet声明周期包括4个阶段。

(1)init()方法

Applet程序的初始化阶段会调用该方法,实现程序初始化。

(2)start()方法

Applet程序的开始阶段,当完成Applet的初始化以后,将会执行该方法。

(3)stop()方法

Applet程序的暂停阶段,当用户离开包含Applet的页面时,将调用该方法。

(4)destroy()方法

Applet程序的销毁阶段,该方法仅在用户正常关闭浏览器时被调用,它用于Applet被结束之前,释放程序所占用的资源和执行程序结束时的任务。

这4个生命周期的方法不应该直接调用,它们由Applet程序自动执行,程序设计人员需要做的就是根据需要覆盖其中的某个方法.

绘图方法

public void paint(Graphics g)

   绘制容器。

   参数为Graphics类的实例,用于在Applet中绘图或者写入文本。

public abstract void drawString(String str,intx,int y)

 str:要绘制的String.

  x:x坐标

 y:   y坐标

重绘repaint()方法

重绘组件。当用户调用repaint()方法时,发生:程序首先清除repaint()方法以前所画的内容,然后再调用repaint()方法。

更新update(Graphicsg)方法

更新容器。update方法通常清除当前的显示并调用paint()方法。

 

 

archive=archiveList

可选属性,描述了一个或多个含有将被“预装”的类和其他资源的archives.

code=appletFile.class

必须属性,插入的类文件。

width=pixels height=pixels

必选属性,给出applet显示区域的初始宽度和高度。

codebase=codebaseURL

可选属性,指定了applet所在的目录。

alt

可选属性,当浏览器能读取applet标记但不能执行java applet时要显示的文本。

name

可选属性,为Applet实例指定有关名称。

align

可选属性,指定了applet的对齐方式。

vspace

可选属性,指定了在applet上下左右的像素数目。

<param name=appletAttributel value=value>

可选属性,提供了一种可带有“外部”指定的数值的Applet,它对一个java应用程序的作用与命令行参数。

Applet用getParameter()方法来存取它们的属性。

实例1Applet程序:

import javax.swing.JApplet;
import java.awt.Graphics;
public class Java_1 extends JApplet{
 public void paint(Graphics g)
  {  g.drawString("欢迎你参加java考试“,25,25);
    }
}

HTML代码如下:

<html>
<applet code="java_1.class"width=300 height=30>
</applet>
</html>

9.2.3 Graphics类

Applet程序中除了使用Swing组件显示界面之外,还可以使用Graphics类提供的各种方法,在Applet程序中绘制多种图形、图片和文字等。

1.绘制文本

2.Graphics类中的方法drawString (String ,int,int)来输出字符串。

3.例如:

4.import javax.swing.*;
5.importjava.awt.*;
6.public classAppletString extends JApplet{
7.    public void paint(Graphics g){
8.       g.drawString("Helloworld",10,20);
9.    }
10.}

2、Graphics类 绘制图片

绘制图片,就是在Applet容器中显示一个事先准备好的图片资源。

(1)drawImage()方法

绘制图片由drawImage()方法实现,它可以指定绘制图片的位置和大小。格式如下:

drawImage(Image img, int x, int y,ImageObserver observer)

   img:该参数是要绘制的图片对象,如果该参数为null,那么该方法不做任何操作。

    x:绘制图片的x坐标。

    y:绘制图片的y坐标。

   observer:绘制图片需要通知的对象,一般设置为Applet本身即可。

drawImage ()方法

drawImage(Image img,int x, int y,int width,int height, ImageObserver observer)

width:该参数指定图片显示的宽度。

height:该参数指定图片显示的高度,这两个参数可以实现图片的缩放。

(2) getImage()方法

在Applet程序中获取图片使用getImage()方法.格式如下:

getImage (URL url)

url:图片文件的URL路径,该路径必须是指定图片文件位置的绝对路径。

getImage (URL url, String name)

    url:给出图片文件基本位置的绝对URL路径,例如

        “F:\\javaex\\/”。

   name:图片位置的相对路径,该路径相对于url参数。

(3)getCodeBase()方法

     当图片与class文件同在一个目下下时,可采用此方法获取图片路径。

     例如:Image i=getImage(getCodeBase(),”01.jpg”);

 

【9-3】在Applet中显示图片

(1)Java文件

import javax.swing.*;
import java.awt.*;
public class ImgPlayer extends JApplet{
   Image img;
   public void init(){
       img=getImage( getCodeBase() ,"04.jpg");
    }
   public void paint(Graphics g){
       g.drawImage(img,10,10,this);
       // g.drawImage(img,10,10,300,200,this); //图片缩放
 
    }
}

(2)html文件

<html>
  <body>
     <Applet code=“ImgPlayer.class” width=500 height=400 >
  </body>
</html>

9.4  音 频 播 放

Java语言除了能够处理图片资源之外,还可以获取并播放音频、视频等多媒体资源。Applet程序可以使用AudioClip接口提供的相关API来实现音频播放、停止和循环播放,支持的主要音频格式有AIFF、AU、MIDI、WAV、RMF等。AudioClip接口中定义了play()、stop()、loop()3个方法,这3个方法分别用于音频播放、停止和循环操作。

 

(1)play()方法

该方法将从头开始重新播放指定的音频剪辑。语法格式为:

play(URL url)  

play(URL url, String name)

参数:

url:该参数指定了音频资源的URL绝对路径。

name:音频文件名称,它相对于url参数的音频剪辑位置

(2)stop()方法

该方法将停止当前正在播放的音频剪辑。

(3)loop()方法

该方法将循环播放指定的音频剪辑。

(4)getAudioClip()方法

该方法可以获取URL参数指定的AudioClip对象,该对象是AudioClip接口的一个实现,当调用该对象的方法进行音频播放时,音频资源中的数据将被加载并播放。

语法格式为:

getAudioClip(URL url)
getAudioClip(URL url, String name)

参数:

url:音频资源的URL参考路径。

name:音频文件名称,它相对于url参数的音频剪辑位置。

(5)newAudioClip()方法

该方法可以创建AudioClip对象,它是一个静态方法,在所有Java程序中都可以使用Applet类的静态方法newAudioClip()创建AudioClip对象,实现音频播放。

一般格式为:

try {
    URL url=new URL(getCodeBase()+"08.WAV");
    AudioClip audio = newAudioClip(url);
} catch (MalformedURLException e) {
    e.printStackTrace();
}

(1)java文件

import java.applet.AudioClip;
import javax.swing.JApplet;
public class Audio1 extends JApplet{
   AudioClip audio;
   public void init(){
       audio=getAudioClip(getCodeBase(),“08.WAV");
    }
   public void start(){       audio.play();    }
   public void stop(){        audio.stop();    }
}

Html文件

<html>
<applet code=“Audio1 .class” height=300 width=200>
</applet>
</html>
import java.applet.AudioClip;
import javax.swing.JApplet;
import java.net.*;
public class Audio2 extends JApplet{
   AudioClip audio;
   public void init(){
try{
       URL url=new URL(getCodeBase()+"99121605.mid");
       audio=newAudioClip(url);
    }
catch(Exception e){}
}
   public void start(){       audio.play();    }
   public void stop(){       audio.stop();    }
}

(1)width属性

该属性用于指定Applet程序在HTML网页中的宽度,例如width=200。这将限制Applet程序界面的大小。

(2)height属性

该属性用于指定Applet程序在HTML网页中的高度,例如height=100。这将限制Applet程序界面的大小。

(3)code属性

该属性用于指定Applet程序的类文件名称,默认情况下,该属性所指定的类文件的位置相对于当前HTML文件所在位置。例如code="Hello.class",那么“Hello.class”文件必须存放在与HTML文件相同的文件夹中。

(4)align属性

该属性是关于Applet程序定位的属性,它可以指定Applet的对齐方式,例如align="left"和align="right"分别可以使Applet左对齐和右对齐,能够实现Applet被文字环绕的效果,如下图所示。


属  性  值    说   明

left  使Applet程序在网页中左对齐,后面的文本环绕在Applet程序右侧

right       使Applet程序在网页中右对齐,后面的文本环绕在Applet程序左侧

top   在网页中使Applet程序顶部与当前行顶部对齐

middle    在网页中使Applet程序中部与当前行的基线对齐

absmiddle       在网页中使Applet程序中部与当前行的中部对齐,请区别于middle

bottom    在网页中使Applet程序底部与当前行文本的底部对齐

absbottom       在网页中使Applet程序底部与当前行底部对齐,请区别于bottom

texttop    在网页中使Applet程序顶部与当前行文本顶部对齐,请区别于top

baseline   在网页中使Applet程序底部与当前行的基线对齐

HTML的Applet标签和属性

(5)vspace属性与hspace属性

这两个属性分别用于设置Applet程序在上下垂直方向空白的像素数目,和Applet程序在左右水平方向空白的像素数目。例如使Applet程序左对齐,并且上下空白50像素,左右空白100像素,可以使用如下的HTML代码:

<Applet code="Hello.class"width=150 height=100 align="left" vspace="50"hspace="100">
</Applet>

 

(6)codebase属性

该属性用于指定Applet程序的路径,该路径相对与当前HTML网页文件,例如“Hello.class”类文件位于myApplets文件夹中,可以使用如下代码加载Applet:

<Applet codebase="myApplets"code="Hello.class" width=150 height=100></Applet>

code属性只用于指定Applet程序名称,例如"com.lzw.Hello.class",而codebase属性则用于指定Applet程序的位置,当指定了codebase属性之后,code属性指定的程序名称,不再相对于当前HTML文件,而是相对于codebase属性指定的程序位置,但是codebase属性则相对与当前HTML文件的位置。

(7)archive属性

该属性可以指定包含Applet程序的JAR文件,JAR文件是Java程序的打包文件,它采用ZIP格式将程序压缩,使Java程序的体积大幅度缩小,这样,在浏览包含Applet程序的网页时,Applet程序的下载时间相对缩短,从而提高程序运行速度。

(8)name属性

该属性为Applet程序指定名称,使网页脚本可以通过改名成获取Applet程序实例,并使用该实例操作Applet程序。

 

        JAR文件是Java的打包文件,它可以将多个编译后的类文件和图片、音频、视频、文本、属性等资源封装到一个JAR文件中。

   (1)使用JDK生成JAR文件的一般格式为:

     jar cvf jarName file1 file2……

    cvf:该参数用于生成JAR压缩文档并输出详细信息。

    jarName:该参数用于指定JAR文件名称。

    file1:添加到JAR文件中的第一个文件。

    file2:添加到JAR文件中的第二个文件(可以使用通配符指定多个文件,也可以在file2参数后再指定其他文件)。

方法一:打包所有文件

(1)将要打包的所有文件放在同一个目录下。

(2)在此目录下创建manifest.mf文件,文件内容:

Main-Class: 主类名 回车

DOS命令行,当前目录为*. Class所在的目录:

(3)当前目录下输入下列命令:

jar cvfm jarName mainfest.mf  file1file2……

方法二:打包一个package

(1)manifest.mf文件中写明主类,格式:

 Main-Class: 包名.主类名 enter

(2)把manifest.mf文件与package放在同一个目录下

(3)DOS命令行,当前目录为包所在的目录:

 jar cvfmjarName mainfest.mf   包名

现在的应用程序、操作系统、开发工具逐渐图形化,而且有很多的命令由于参数过多难以记忆,使用开发工具完成JAR文件的创建已经是最常用的一种方式。Eclipse作为一个强大的Java开发工具,不但提供了Java源程序的代码辅助、智能纠错、动态调试等环境,而且还可以直接将程序代码导出成为一个JAR文档文件。

具体操作步骤如下。

将程序制作成JAR文件之后,在HTML的<Applet>标签中访问JAR文件中的Applet程序可以使用如下HTML代码:

<html>
    <body>
    <Applet code="AudioPlayer.class" width=437 height=200archive="AudioPlay.jar">
    </Applet>
    </body>
</html>

<Applet>标签使用archive属性指定了“AudioPlay.jar”文件,Applet程序在运行时期,会先下载该JAR文件,然后运行JAR文件中的ImgPlayer.class类文件。

 

HTML的<Applet>标签可以为Applet程序设置各种初始属性,例如宽度、高度、对齐方式等,但是有些情况下,Applet程序需要根据参数初始化自己,这可以通过<Applet>标签的子标签<Param>来实现。

一般格式为:

<Applet code="……" width=437 height=200>
    <param name="参数名" value="参数值">
     ……
</Applet>

name:该参数用于设置传递给Applet程序的参数名称。

value:该参数用于设置传递给Applet程序的参数值。

在Applet程序中可以使用getParameter()方法获取<param>标签提供的参数。

语法格式为:getParameter(Stringarg)

arg:该参数是<param>标签设置的参数名称。

例如,获取<param>标签设置的商品单价参数“price”,可以使用如下代码:

public void init() {
    String priceArg = getParameter("price");
    float price=Float.parseFloat(priceArg);
     ……
}

在Applet程序中可以使用getParameter()方法获取<param>标签提供的参数。

语法格式为:getParameter(Stringarg)

arg:该参数是<param>标签设置的参数名称。

例如,获取<param>标签设置的商品单价参数“price”,可以使用如下代码:

public void init() {
    String priceArg = getParameter("price");
    float price=Float.parseFloat(priceArg);
     ……
}
import java.awt.*;
 import javax.JApplet.*;
 public class ParamApplet extends JApplet{
    int sum;
    String s1,s2;
    public void init(){
      s1=getParameter(“girl”);
      s2=getParameter(“boy”);
         //需要将字符串转化为整形后才可以进行计算
      sum=Integer.parseInt(s1)+Integer.parseInt(s2);
     }
    public void paint(Graphics g)
  {      g.drawString(“女”+s1+”名,”+”男”+s2+”,共”+sum+”人。”,50,50);    }
 }

HTML的<Applet>标签可以使用name属性为Applet程序命名,这样JavaScript脚本就可以获取Applet程序的实例,并调用Applet程序的方法执行相关操作。

【例9-6】

 

Applet上下文是实现AppletContext接口的对象。通过该对象可以实现获取同一个网页中的所有Applet程序、在浏览器状态栏中显示信息、显示指定URL的网页等。获取Applet上下文需要使用getAppletContext()方法。

一般格式为:

AppletContext appletContext = getAppletContext();

Applet上下文提供了获取其他Applet程序实例的方法,这样就可以控制获取的Applet程序实例,从而实现对其他Applet程序的控制。Applet上下文中获取其他Applet程序的方法有两种。

 

(1)getApplets()方法

getApplets()方法用于获取包含在同一个上下文中的所有Applet程序,该方法返回一个枚举类型的实例,这个枚举类型中包含了同一个上下文中的其他Applet程序的引用。

语法格式为:

Enumeration applets = appletContext.getApplets();

appletContext:这是一个Applet上下文对象。

 

(2)get Applets(String name)方法

getApplets()方法用于获取同一个上下文中指定名称的Applet程序,该方法返回一个Applet程序的引用。

语法格式为:

appletContext.getApplet(String name);

appletContext:这是一个Applet上下文对象。

name:该参数是另外一个Applet程序的名称。

【例9-7】

Applet程序存放在远程服务器端,当用于浏览服务器的网页时,将自动下载该Applet程序,然后在本地执行,如果有人使用Applet程序编写恶意程序,对用户主机进行攻击,或盗取用户资料,例如银行账号、密码等信息,将对用户造成极大地损害。所以,安全成为Applet至关重要的问题。

Applet程序可以运行在任何一个平台(即操作系统)中,在不同的平台上可以实现相同的功能,这些功能包括:

(1)显示图片;

(2)播放音频;

(3)获取用户的鼠标、键盘操作事件;

(4)把用户输入的信息提交给服务器。

这些功能对于网站信息提示、图片处理、在线交互、提交订单等业务来讲,已经足够完成网站中的各种任务。所以,对于其他操作必须加以限制,例如访问本地文件、获取用户和系统信息等操作。

Applet拥有安全管理器,它为程序提供了足够的安全保障,当Applet程序违反安全规则时,Applet安全管理器将抛出SecurityException异常,Applet有以下安全限制。

(1)不允许执行任何本地程序。

(2)不允许对本地文件进行读写操作。

(3)在Applet弹出窗口中都会带有一个警告信息。

(4)只能获取少量的计算机信息,例如Java虚拟机的版本、操作系统版本与名称,还有文件分隔符、换行符等特殊字符。

(5)不能获取用户名、E-mail地址等信息。

(6)Applet不能与其他服务器通信,只能与存放Applet程序的服务器进行通信。