第 10 章 applet 编程

51
http://www.wenyuan.com.cn/webnew/ 10 10 Applet Applet 第第 第第 第第第 (: 2 第第4 第第

Upload: ovid

Post on 13-Jan-2016

120 views

Category:

Documents


5 download

DESCRIPTION

第 10 章 Applet 编程. (时间: 2 次课, 4 学时). 第 10 章 Applet 编程. 教学提示: Java Applet 是一类特殊的 Java 程序,通常称为 Java 小应用程序,它嵌入在 HTML 语言中,随网页发布到 Internet 上。它与 Java Application 的区别主要在于其执行方式的不同, Java Application 是从 main() 方法开始运行的,而 Java Applet 则相对复杂 — 点,它可以在浏览器环境中运行。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

第第 1010 章 章 AppletApplet 编程编程

(时间: 2 次课, 4 学时)

Page 2: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

第第 1010 章 章 AppletApplet 编程编程 教学提示: Java Applet 是一类特殊的 Java 程序,通

常称为 Java 小应用程序,它嵌入在 HTML 语言中,随网页发布到 Internet 上。它与 Java Application 的区别主要在于其执行方式的不同, Java Application 是从main() 方法开始运行的,而 Java Applet 则相对复杂—点,它可以在浏览器环境中运行。

本章主要介绍: Applet 的基本知识、 Appletviewer 、HTML 中的 Applet 标记和应用 JAR 包

Page 3: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

第第 1010 章 章 AppletApplet 编程编程 10.1 Applet 的基本知识 10.2 Appletviewer 10.3 HTML 中的 Applet 标记 10.4 应用 JAR 包 10.5 Applet 编程实例 10.6 课后练习

Page 4: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.1 Applet10.1 Applet 的基本知识 的基本知识

10.1.1 Applet 的工作原理 10.1.2 Applet 类的主要方法

Page 5: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.1 Applet10.1 Applet 的基本知识 的基本知识

在揭开 Applet 神秘面纱之前,首先需要了解 Applet

的工作机制和使用,下面将详细介绍。

Page 6: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.1.1 Applet10.1.1 Applet 的工作原理 的工作原理 Applet 是一种 Java 的小程序,它通过使用该 Applet 的 HTML 文件,由

支持 Java 的网页浏览器下载运行。也可以通过 Java 开发工具的 Applet

viewer 来运行。 Applet 程序离不开使用它的 HTML 文件。这个 HTM

L 文件中关于 Applet 的信息至少应包含以下 3 点: 字节码文件名 ( 编译后的 Java 文件,以 .class 为后缀 ) 。 字节码文件的地址。 在网页上显示 Applet 的方式。 一个 HTML 文件增加 Applet 有关的内容只是使网页更加富有生气,如

添加声音、动画等这些吸引人的特征,它并不会改变 HTML 文件中与Applet 无关的元素。

Page 7: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.1.1 Applet10.1.1 Applet 的工作原理 的工作原理 下面举一个最简单的 HelloWorld 例子来说明 Applet 程序的

开发过程。 (1) 编辑 Applet 的 Java 源文件 创建文件夹 C:\ghq ,在该文件夹下建立 HelloWorld.java 。文件的源代码

如下: import java.awt.*; import java.applet.*; public class HelloWorld extends Applet // 继承 Appelet 类,这是 Appel

et Java 程序的特点 { public void paint(Graphics g ) { g.drawString("Hello World!",5,35) ; } } 保存上述程序在 C:\ghq\HelloWorld.java 文件里。

Page 8: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.1.1 Applet10.1.1 Applet 的工作原理 的工作原理 (2) 编译 Applet 编译 HelloWorld.java 源文件可使用如下 JDK 命令: C:\ghq\ > javac HelloWorld.java (3) 创建 HTML 文件 在运行创建的 HelloWorld.class 之前,还需创建一个 HTML

文件, Appletviewer 或浏览器将通过该文件访问创建的 Applet 。为运行 HelloWorld.class ,需要创建包含如下 HTML 语句的名为 HelloWorld.html 的文件。

< HTML > < TITLE > HelloWorld! Applet < /TITLE > < APPLET CODE="HelloWorld.class" WIDTH=100 HEIGHT

=100 > < /APPLET > < /HTML >

Page 9: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.1.1 Applet10.1.1 Applet 的工作原理 的工作原理 (4) 执行 HelloWorld.html 如果用 Appletviewer 运行 HelloWorld.html ,需输入如下的命

令行: C:\ghq\ > Appletviewer HelloWorld.html 可以看出,该命令启动了 Appletviewer 并指明了 HTML 文件,

该 HTML 文件中包含对应于 HelloWorld 的< APPLET >语句。

如果用浏览器运行 HelloWorld Applet ,需在浏览器的地址栏中输入 HTML 文件的 URL 地址。

至此,一个 Applet 程序的开发运行整个过程结束了 ( 包括 Java 源文件、编译的 class 文件、 HTML 文件以及用 Appletviewer 或用浏览器运行 ) 。

Page 10: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.1.2 Applet10.1.2 Applet 类的主要方法 类的主要方法 1. Applet 类的常用方法 public final void setStub(AppletStub stub) :设置 Applet 的 stub 。 stub 是

Java 和 C 之间转换参数并返回值的代码位,它是由系统自动设定的。 public boolean isActive() :判断一个 Applet 是否处于活动状态。 public URL getDocumentBase() :检索表示该 Applet 运行的文件目录的对象。 public URL getCodeBase() :获取该 Applet 代码的 URL 地址。 public String getParameter(String name) :获取该 Applet 由 name 指定参

数的值。 public AppletContext getAppletContext() :返回浏览器或小应用程序观察器。 public void resize(int width,int height) :调整 Applet 运行的窗口尺寸。 public void resize(Dimension d) :调整 Applet 运行的窗口尺寸。 public void showStatus(String msg) :在浏览器的状态条中显示指定的信息。 public Image getImage(URL url) :按 url 指定的地址装入图像。 public Image getImage(URL url,String name) :按 url 指定的地址和文件名加

载图像。 public AudioClip getAudioClip(URL url) :按 url 指定的地址获取声音文件。 public AudioClip getAudioClip(URL url, String name) :按 url 指定的地址和

文件名获取声音。

Page 11: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.1.2 Applet10.1.2 Applet 类的主要方法 类的主要方法 public String getAppletInfo() :返回 Applet 应用有关的作者、版

本和版权方面的信息。 public String[][] getParameterInfo() :返回描述 Applet 参数的字

符串数组,该数组通常包含 3 个字符串:参数名、该参数所需值的类型和该参数的说明。

public void play(URL url) :加载并播放一个 url 指定的音频剪辑。 public void destroy() :撤消 Applet 及其所占用的资源。若该 Appl

et 是活动的,则先终止该 Applet 的运行。 2. Applet 运行状态控制基本方法 Applet 类中的 4 种基本方法用来控制其运行状态,它们是 init() 、 st

art() 、 stop() 、 destroy() 。 init() 方法:这个方法主要是为 Applet 的正常运行做一些初始化工作。当一个 Applet被系统调用时,系统首先调用的就是该方法。通常可以在该方法中完成从网页向 Applet传递参数,添加用户界面的基本组件等操作。

Page 12: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.1.2 Applet10.1.2 Applet 类的主要方法 类的主要方法 start() 方法:系统在调用完 init() 方法之后,将自动调用 start()

方法。而且,每当用户离开包含该 Applet 的主页后又再返回时,系统又会再执行一遍 start() 方法。这就意味着 start() 方法可以被多次执行,而不像 init() 方法。因此,可把只希望执行一遍的代码放在 init() 方法中。可以在 start() 方法中开始一个线程,如继续一个动画、声音等。

stop() 方法:这个方法在用户离开 Applet 所在页面时执行,因此,它也是可以被多次执行的。它可以在用户并不注意 Applet 的时候,停止一些耗用系统资源的工作以免影响系统的运行速度,且并不需要人为地去调用该方法。如果 Applet 中不包含动画、声音等程序,通常也不必实现该方法。

destroy() 方法:与对象的 finalize() 方法不同, Java 在浏览器关闭的时候才调用该方法。 Applet 是嵌在 HTML 文件中的,所以 destroty() 方法不关心何时 Applet被关闭,它在浏览器关闭的时候自动执行。在 destroy() 方法中一般可以要求收回占用的非内存独立资源 (如果在 Applet仍在运行时浏览器被关闭,系统将先执行 stop() 方法,再执行 destroy() 方法 ) 。

Page 13: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.2 Appletviewer 10.2 Appletviewer

10.2.1 什么是 Appletviewer 10.2.2 用 Appletviewer 启动 Apple

t 10.2.3 使用 Appletviewer

Page 14: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.2 Appletviewer 10.2 Appletviewer

编写好了 Applet 程序,还要运行 Applet 程序,这时就要使用 Appletviewer ,本节将详细介绍 Appletviewer 的使用。

Page 15: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.2.1 10.2.1 什么是什么是 Appletviewer Appletviewer Applet 通常运行于一个 Web 浏览器中,如 HotJava TM 、 Ne

tscape 或 Navigator ,它们有支持 Java 软件程序运行的能力。为了简化和加速开发过程, JDK 应运而生,它附带有一个专为查看 Applet 而设计但不支持 HTML 页面查看的工具。这个工具就是 Appletviewer 。

Appletviewer 是使你不必使用 Web 浏览器即可运行 Applet 的一个 Java 应用程序。它犹如一个“最小化的浏览器”。

Appletviewer 读取命令行中 URL 所指定的 HTML 文件。这个文件必须包含装入及执行一个或多个 Applet 的指令。 Appletviewer 忽略了所有其他的 HTML 代码。它不能显示普通的HTML 或嵌入在一个文本页中的 Applet 。

Page 16: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.2.2 10.2.2 用用 AppletviewerAppletviewer 启动启动 Applet Applet

Appletviewer 将一个框架样式的区域粘贴在屏幕上,然后实例化该 Applet 并将这个 Applet 实例贴在已有的框架中。

Appletviewer 带有一个命令行参数形式的 URL ,它指向一个含有 Applet 引用的 HTML 文件。这个 Applet 引用是一个指定了 Appletviewer 要装载的代码的 HTML 标记。

< HTML > < TITLE > HelloWorld! Applet < /TITLE > < APPLET CODE="HelloWorld.class" WIDTH=100 HEIGHT

=100 > < /APPLET > < /HTML >

Page 17: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.2.3 10.2.3 使用使用 Appletviewer Appletviewer Appletviewer 带有一个指向包含 <APPLET> 标记的 HTML 文

件的 URL ,这个 URL 被作为命令行参数。 Appletviewer [-debug] URLs ... Appletviewer 仅有的合法选项是 -debug ,它使得 Applet 在 Ja

va 调试器 jdb 中启动。若用带 -g 选项的方式编译 Java 代码,则可在调试器中看到源代码。

Page 18: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.3 HTML10.3 HTML 中的中的 AppletApplet 标记 标记 利用 Applet 可以接收从 HTML 中传递过来的参数,下面对涉及到的标

记作一简单说明。 CODE 标记。 CODE 标记指定 Applet 的类名; WIDTH 和 HEIGHT 标记

指定 Applet 窗口的像素尺寸。在 APPLET 语句里还可使用其他一些标记。 CODEBASE 标记。 CODEBASE 标记指定 Applet 的 URL 地址。 Applet

的通用资源定位地址 URL ,它可以是绝对地址,如 www.sun.com 。也可以是相对于当前 HTML 所在目录的相对地址,如 /AppletPath/Name 。如果 HTML 文件不指定 CODEBASE 标记,浏览器将使用和 HTML 文件相同的 URL 。

ALT 标记。虽然 Java 在 WWW 上很受欢迎,但并非所有浏览器都对其提供支持。如果某浏览器无法运行 Java Applet ,那么它在遇到 APPLET语句时将显示 ALT 标记指定的文本信息。

ALIGN 标记。 ALIGN 标记可用来控制把 Applet 窗口显示在 HTML 文档窗口的什么位置。与 HTML < IMG >语句一样, ALIGN 标记指定的值可以是 TOP 、 MIDDLE 或 BOTTOM 。

Page 19: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.3 HTML10.3 HTML 中的中的 AppletApplet 标记 标记 VSPACE 与 HSPACE 标记。 VSPACE 和 HSPACE 标记分别

指定浏览器显示在 Applet 窗口周围的水平和竖直空白条的尺寸,单位为像素。如可以使用该标记在 Applet 窗口之上和之下各留出 50 像素的空白,在其左和其右各留出 25 像素的空白。

NAME 标记。 NAME 标记把指定的名字赋予 Applet 的当前实例。当浏览器同时运行两个或多个 Applet 时,各 Applet可通过名字相互引用或交换信息。如果忽略 NAME 标记,Applet 的名字将对应于其类名。

PARAM 标记。通用性是程序设计所追求的目标之一。使用户或者程序员能很方便地使用同一个 Applet完成不同的任务是通用性的具体表现。从 HTML 文件获取信息是提高 Applet通用性的一条有效途径。 PARAM 标记较好地实现了 Applet的通用性。

Page 20: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.3 HTML10.3 HTML 中的中的 AppletApplet 标记 标记 PARAM 标记可用来在 HTML 文件里指定参数,格式如下所

示: PARAM Name="name" Value="Liter" 下面是用 Java Applet 的 getParameter 方法获取 HTML 文件

里设置的参数值。以用于小程序的运行。 Applet 类的参数获取通过 getParameter 方法来完成,比如在 HTML 中有如下代码:

<applet code="JumpTextApplet" width=50 height=50> <param name= SPEED value="200"> </applet> 用 getParameter("SPEED") 方法将返回字符串 200 ,再用相

应的方法转换成需要的数据类型。如果在网页中未设置参数,即得到的是 null值,则需要设置一个默认的参数值,让 Applet 以默认参数运行。

Page 21: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.3 HTML10.3 HTML 中的中的 AppletApplet 标记标记 下面是在 Java 程序中,来读取 HTML 文档中的参数。 if((param = getParameter("BGCOLOR")) == null) bgColor = Color.lightGray; else bgColor = new Color(Integer.parseInt(param)); setBackground(bgColor); if((param = getParameter("SPEED")) != null) speed = Integer.valueOf(param).intValue(); if(speed == 0) speed = 200; 如果读取的参数的名称是 BGCOLOR ,则将背景设置为 HT

ML 中指定的颜色;如果读取的参数的名称是 SPEED ,则设置速度为 HTML 中指定的值。

Page 22: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.4 10.4 应用应用 JARJAR 包 包 JAR(Java Archive) 是一种与平台无关的文档格式,一般叫 Ja

va 存档,它相当于一种压缩格式,可以把众多的文档合成一个文件。

大多数的 Applet都由多个类组成,使用浏览器来浏览这样的Applet 时,由于一个文件需要一个连接,所以浏览器需要使用多个连接,这样在一个低速的网络上加载一个 Applet 需要好几分钟。这里值得注意的是,加载 Applet 需要较长的时间的原因并不是因为类文件太大,关键的原因是建立到服务器的连接需要的时间长。

对于 Applet 来说, JAR 文件可以将多个需要的类文件合并为一个单一的文件。这是很有意义的,这样这些类文件可以作为一个整体使用一个 HTTP事务下载到浏览器中,从而大大提高浏览速度。

Page 23: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.4 10.4 应用应用 JARJAR 包 包 jar命令格式如下: jar [选项 1] … [选项 n] 文件名 1 文件名 2 … jar命令的选项如下。 c :创建新的存档,并把文件添加至其中,如果一个文件名是一个目录,

它将被递归处理。 t :列出存档内容的列表。 x :展开存档中的命名的 ( 或所有的 ) 文件。 u :更新已存在的存档。 v :生成详细输出到标准输出上。 f :指定存档文件名。 m :包含来自标明文件的标明信息。 0 :只存储方式,未用 ZIP压缩格式。 M :不产生所有项的清单 (manifest) 文件。 i :为指定的 jar 文件产生索引信息。 C :改变到指定的目录。

Page 24: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.4 10.4 应用应用 JARJAR 包 包 例如: jar cvf imagetest.jar d:\image tt.gif 以上代码将 D盘下的 image 文件夹里的 tt.gif 文件加入 imagetest.jar 包中。

在相应的 HTML 文件里添加标记语言时,应在Applet 标记中增加 archive属性,用它来指定 jar 包的路径。例如:

<applet code="test.class" height=600 width=400 archive="imagetest.jar">

</applet>

Page 25: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5 Applet10.5 Applet 编程实例 编程实例

10.5.1 编写一个Applet 10.5.2 获取键盘事件 10.5.3 捕获鼠标事件 10.5.4 计算器 10.5.5 图片百叶窗

Page 26: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5 Applet10.5 Applet 编程实例 编程实例

本节通过 5 个例子 ( 包括波浪文字、获取键盘事件、获取鼠标事件、计算器以及图片百叶窗 ) 来展示 Applet 的强大功能。

Page 27: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.1 10.5.1 编写一个编写一个 Applet Applet 下面将通过 Applet 来实现波浪文字,进而展示 Appl

et 的魅力。波浪文字具有较强动感,用在网页特效中能达到出奇制胜的效果,流畅的波动加上色彩的变幻会给人耳目一新的感觉,加深对页面的印象。本例实现了波浪文字效果,实例的运行结果如图 10-1 、图 10-2 所示,图中的文字以一定的节奏呈波浪状起伏。

Page 28: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.1 10.5.1 编写一个编写一个 Applet Applet

图 10-1 效果一 图 10-2 效果二

Page 29: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.1 10.5.1 编写一个编写一个 Applet Applet 1. 分解字符串 在本例中需要对各个字符进行单独处理,在得到显示文字的字符串后,首先对其进行分解,得到各个字符。通过 Applet 类的 getParameter方法,得到 HTML 文件中设置的显示文本。

String 类的 length 方法返回字符串的长度, getChars 方法将字符串填充到数组中。

getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将字符串分解为字符,并填充到字符串数组中。参数依次为:字符串中复制起始点、复制长度、目标数组、目标数组起始位置。

String message; char[] words; message = getParameter("Text"); words = new char [message.length()]; message.getChars(0,message.length(),words,0);

Page 30: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.1 10.5.1 编写一个编写一个 AppletApplet 2. 波浪效果的形成 FontMetric 类提供了获取显示文本各种属性的方法,用 ge

tMaxAdvance 方法可取得一个字符的 advance 值,即字符的宽度。

Math 类的 sin 和 cos 方法分别计算出角度的正弦和余弦值。direct变量表示波动的方向, Hrad 和 Vrad 参数分别表示波动的水平和垂直方向上的距离。通过这几个参数,计算出波动的角度和 x坐标、 y坐标。

Graphics 类的 drawChars 方法可在指定位置绘制一个或多个字符,方法原型如下:

drawChars(char[] data, int offset, int length, int x, int y);

在指定位置绘制字符,参数依次为:字符数组、待绘制字符在数组中的起始位置、字符长度 (即绘制多少个字符 ) 、绘制字符的 x坐标、 y坐标。

Page 31: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.1 10.5.1 编写一个编写一个 AppletApplet int x, y; double ang; int Hrad = 12; int Vrad = 12; phase+=direct; phase%=8; for(int i=0;i<message.length();i++) { ang = ((phase-i*direct)%8)/4.0*Math.PI; x = 20+fontMetric.getMaxAdvance()*i+(int)(Math.cos(ang)*Hrad); y = 60+ (int) (Math.sin(ang)*Vrad); graphics.setColor(colors[(phase+i)%message.length()]); graphics.drawChars(words,i,1,x,y); } g.drawImage(image,0,0,this);

Page 32: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.1 10.5.1 编写一个编写一个 AppletApplet 3. 代码 下面是该程序的代码: import java.awt.*; import java.applet.*; public class WaveTextApplet extends Applet implements Runna

ble { String message; // 显示文本 int direct,phase; // 运动方向参数 Thread thread; //波浪运动线程 char words[]; // 显示文本的字符数组 Image image; //Image 对象 Graphics graphics; //Graphics 对象 Color colors[]; // 显示文本颜色 private Font font; // 显示字体 private FontMetrics fontMetric; // 显示字体的 FontMetrics 对象

Page 33: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.1 10.5.1 编写一个编写一个 AppletApplet public void init() { direct=1; //初始方向值 phase = 0; message = getParameter("Text"); //得以显示文本 if (message==null){ //如果文本为空 message=" 波浪文字 "; // 设置默认文本 } setBackground(Color.black); // 设置背景色 words = new char [message.length()]; //初始化显示字符数组 message.getChars(0,message.length(),words,0); image = createImage(getSize().width,getSize().height); //得到 Image 实例 graphics = image.getGraphics(); //得到 Graphics 实例 font = new Font("TimesRoman",Font.BOLD,36); // 设置显示字体 fontMetric=getFontMetrics(font); //得到字体的 FontMetric 对象 graphics.setFont(font); // 设置显示字体 float h; colors = new Color[message.length()]; //初始化颜色数组 for (int i = 0; i < message.length(); i++) { h = ((float)i)/((float)message.length()); colors[i] = new Color(Color.HSBtoRGB(h,1.0f,1.0f)); //填充颜色数组数据 } }

Page 34: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.1 10.5.1 编写一个编写一个 AppletApplet public void start() { if(thread == null) { thread = new Thread(this); // 实例化线程 thread.start(); // 运行线程 } } public void run() { while (thread != null) { try { Thread.sleep(200); //线程休眠 }catch (InterruptedException e) {} repaint(); //重绘屏幕 } } public void update(Graphics g) { } public void paint(Graphics g) { update(g); } }

Page 35: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.2 10.5.2 获取键盘事件 获取键盘事件 在执行 Applet 小程序时,可以让程序接收键盘事件,这

样可以更好地实现人机对话功能。方法是直接在程序中调用 addKeyListener(KeyListener obj) 方法,并使用无名类的方式实现 KeyLisener 接口中的方法,此处可以根据用户需求实现其中所需要的方法即可,也可以全部实现。

接口 KeyListener 内所定义的方法如下。 void keyPressed(KeyEvent e) :按下某个键时调用此方法。

void keyReleased(KeyEvent e) :释放某个键时调用此方法。

void keyTyped(KeyEvent e) :键入某个键时调用此方法。 下面的程序是通过 Applet 小程序,向网页中连续加载图片,实现动画效果。并接收键盘的 Keypress事件。

Page 36: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.2 10.5.2 获取键盘事件 获取键盘事件 import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; public class AppletTest extends Applet { private Image img[]; private String []se; private int currentImage; public void init() { File f=new File("D:\\Javacode\\se"); String name[]=f.list(new FilenameFilter() { public boolean accept(File dir, String nam) { return nam.indexOf(".jpg")!=-1; } } );

Page 37: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.2 10.5.2 获取键盘事件 获取键盘事件 addKeyListener(new KeyListener(){ public void keyTyped(KeyEvent e){} //键入键事件 public void keyPressed(KeyEvent e) { System.out.println("hit the board has opened!"); } public void keyReleased(KeyEvent e){} //释放键事件 }); se=name; img=new Image[se.length]; for(int i=0;i<se.length;i++) { img[i]=getImage(getDocumentBase(),"se\\"+se[i]); } } public void start() { currentImage=3; }

Page 38: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.2 10.5.2 获取键盘事件获取键盘事件 public void paint(Graphics g) { currentImage=++currentImage%sex.length; g.drawImage(img[currentImage],55,66,this); g.drawLine(5,55,56,656); System.out.println("fsd"+currentImage); try { Thread.sleep(500); } catch(Exception e) { e.printStackTrace(); } repaint(); } }

Page 39: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.3 10.5.3 捕获鼠标事件 捕获鼠标事件

Applet 小程序除了可以捕获键盘事件外,同样也可以捕获鼠标事件。这时需要调用 addMouseListener(MouseListener obj) 方法。该方法接收的参数是一个接口 MouseListener ,该接口的方法成员如下:

void mouseClicked(MouseEvent e) :鼠标按键在组件上单击 ( 按下并释放 )时调用。

void mouseEntered(MouseEvent e) :鼠标进入到组件上时调用。 void mouseExited(MouseEvent e) :鼠标离开组件时调用。 void mousePressed(MouseEvent e) :鼠标按键在组件上按下时调用。

void mouseReleased(MouseEvent e) :鼠标按钮在组件上释放时调

用。

Page 40: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.4 10.5.4 计算器 计算器

1. 界面设计 整个界面由 3 个面板组成,第 1 个面板放置输入信息和运算结果的显示

文本域以及一个清除输入的按钮。 setLayout 方法用于设置容器的布局管理器,这里采用流布局,即 FlowLayout ,所有放置的组件按大小依次排列。

panel1.setLayout(new FlowLayout()); panel1.add(tfAnswer); panel1.add(bClear); 第 2 个面板放置数字按钮、点按钮及等于按钮。在 for循环中,依次实

例化 9 个数字按钮,并将按钮用 add 方法加入到第 2 面板中。 setForeground 方法可为组件设置前景色,这里将按钮文字设置为红色 (C

olor.red) 显示,以将功能按钮与数字按钮区分开来。 for(int i=9;i>=0;i--){ b[i]=new Button(Integer.toString(i)); panel2.add(b[i]); }

Page 41: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.4 10.5.4 计算器 计算器 bEqual = new Button("="); bEqual.setForeground(Color.red); panel2.add(bPoint); panel2.add(bEqual); 第 3 个面板放置 4 个运算符:加、减、乘、除。 panel3.add(bPlus); panel3.add(bMinus); panel3.add(bMulti); panel3.add(bDivision); 最后,将 3 个面板放置到 Applet 中, Applet按照 FlowLayout布局,依次加入的 3 个面板会按照加入的顺序及它们的尺寸放置到合适的位置。

setLayout(new FlowLayout()); add(panel1); add(panel2); add(panel3);

Page 42: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.4 10.5.4 计算器计算器

2. 事件处理 事件处理通过 action 方法来完成,方法体如下所示: public boolean action(Event e, Object o) {} 可通过 Event 类的 target 变量来获取事件来源,如下面的语

句,将 e.target 与等于按钮 bEqual相比较,如果相符,则事件来源于等于按钮,这里应调用对应的方法处理运算结果,并显示出来。

if(e.target == bEqual) { doOperator(); }

Page 43: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.4 10.5.4 计算器计算器 3. 数值运算 从输入得到的都是字符串,在运算之前,需要转换成其他数据类型。这

里,需要将字符串转换成 double值。首先,从字符串得到一个 Double类的实例,以该实例的 doubleValue 方法可得与字符串对应的 double值。也可以用 Double 类的 parseDouble 方法直接从字符串得到 double值。

在 if 语句中,将运算符与字符“+”比较,得到运算类型,如果为加,则直接将两者相加,得到运算结果,并通过 setText 方法将结果显示在文本域中。

dFore = (new Double(foreText)).doubleValue(); dBack = (new Double(backText)).doubleValue(); if(preOp.equals("+")) { d = new Double((dBack + dFore)); tfAnswer.setText(d.toString()); backText = d.toString(); }

Page 44: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.4 10.5.4 计算器计算器 4. 计算器程序 下面是设计计算器的代码(详见书 315~317 页) 运行效果如图 10-3 所示。

图 10-3 运行效果

Page 45: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.5 10.5.5 图片百叶窗 图片百叶窗 1. 从图像获取像素数组 java.awt.image.PixelGrabber 是在给定图像中抓取矩形区域中的像素的 Im

ageConsumer 接口的一个实现,可通过它来抓取一定的图像区域到像素数组中。

PixelGrabber(ImageProducer ip, int x, int y, int w, int h, int[] pix, int off, int scansize) 是 PixelsGrabber 类的构造函数。其参数依次为:待抓取的 Image对象、起始点 x坐标、起始点 y坐标、抓取宽度、抓取高度、目标数组(缓冲区 ) 、偏移量、数组中相邻两行之间的距离。

PixelsGrabber 类的 grabPixels 方法完成图像的抓取,并等待处理过程的完成或超时。

pix1 = new int[totalPix]; PixelGrabber pg1 = new PixelGrabber(images[0],0,0,imageWidth,imageHeig

ht,pix1,0,imageWidth); try{ pg1.grabPixels(); } catch(InterruptedException ex){}

Page 46: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.5 10.5.5 图片百叶窗 图片百叶窗 2. 从像素数组获取图像 与 PixelsGrabber 类相对应, MemoryImageSource 类将像素数组转换为图

像。 MemoryImageSource 类实现了 ImageProducer 接口。 MemoryImageSource(int w, int h, int[] pix, int off, int scan) 的参数依次为图

像宽度、图像高度、像素数组、偏移量和数组中的行距。 createImage(ImageProducer producer) 接受 ImageProducer 对象,创建对应

的 Image 对象。 System 类的 arraycopy 方法实现数组的复制功能,其原型如下。 arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :参数

包括源数组、复制起始点、目标数组、复制数据起始点、复制长度。 System.arraycopy(pix1,0,pixA,0,totalPix); System.arraycopy(pix2,0,pixB,0,totalPix); showImage = createImage(new MemoryImageSource(imageWidth,imageHei

ght,pixA,0,imageWidth));

Page 47: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.5 10.5.5 图片百叶窗 图片百叶窗 3. 百叶窗效果的形成 百叶窗效果主要是通过显示的两张图像之间的部分像素点的交换来实现的。在第 1 个 for循环中,循环次数按照图像高度来确定,把整个图像按高度分为 10部分,实现两张图像的切换。

在接下来的一个 for循环中,将下一张图片的部分像素赋值给当前显示的图像,并用交换了一部分像素之后的像素数组形成新的 Image 对象,用 repaint 方法绘制在屏幕上。

for(int i=0; i<(int)(imageHeight/10);i++){ try{ thread.sleep(20); //线程休眠 for(int j=0; j<imageHeight; j+=(int)(imageHeight/10)){ for(int k=0; k<imageWidth; k++) { pixA[imageWidth*(j+i) + k] = pixB[imageWidth*(j+

i) + k]; } } } catch(InterruptedException e){} showImage = createImage(new MemoryImageSource(imageWidth,imageHeight,pix

A,0, imageWidth)); repaint(); }

Page 48: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.5.5 10.5.5 图片百叶窗图片百叶窗 4. 图片百叶窗程序 下面是该程序的代码(详见书 319~322 页) 运行结果如图 10-4 所示。

图 10-4 运行效果图

Page 49: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.6 10.6 课后练习 课后练习 1. 填空题 (1) 在 JDK软件包中有一个模拟WWW 浏览器运行 Applet 的应用

程序 __________,使用它调试程序就不必反复调用 Web 浏览器了。 (2) 在第 1次加载 Applet时,默认最先执行的方法是 __________。 2. 选择题 (1) 下列方法中,不是 Applet 的基本方法的是 ( ) 。 A. init() B. run() C. stop() D. start() (2) 在 Java 中判定 Applet 的来源的方法有 ( ) 。 A. _getcodebase() B. _getdocumentbase() C. _getCodeBase() D. _getDocumentBade() 3. 判断题 (1) Java Applet 程序是可以独立运行的程序。 ( ) (2) Java Application 的输入输出既可以是字符界面,也可以是图形界面。 ( )

Page 50: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

10.6 10.6 课后练习 课后练习 4. 简答题 (1) 什么是 Java Application? (2) 什么是 Java Applet? (3) Applet 程序的基本控制方法有哪些? (4) 在 Applet 程序中可以获得哪些事件? 5. 操作题 (1) 编写一个 Java Application 程序,接受用户输入

一行字符串,并输出该字符串。 (2) 编写一个 Applet 程序和相应的页码文件,通过页

面文件传递参数,在 Applet 程序中绘制一个长方形。

Page 51: 第 10 章   Applet 编程

http://www.wenyuan.com.cn/webnew/

Q & A?Q & A?

Thanks!Thanks!