第九讲 Java Applet 1、所有小应用程序的根源 2、小应用程序的执行 3、图形操作 4、播放声音 5、图象操作 6、动态效果

Slides:



Advertisements
Similar presentations
7.1 内置对象概述及分类 JSP 视频教学课程. JSP2.2 目录 1. 内置对象简介 1. 内置对象简介 2. 内置对象分类 2. 内置对象分类 3. 内置对象按功能区分 3. 内置对象按功能区分 4. 内置对象作用范围 4. 内置对象作用范围.
Advertisements

第 2 章 Java 运行环境搭建 2.1 Java 的运行系统 2.1 Java 的运行系统 2.2 JDK 的安装与配置2.2 JDK 的安装与配置 2.3 Java 开发工具包 2.4 Java 源文件编辑环境的选择 2.5 Application 和 Applet 程序的编写与运行.
Java 程序分类 Java Application :是完整程序,需要独立的解 释器解释运行;以 “.java” 为后缀的文件,以 main() 方法作为程序入口,由 java 编译器编译生 成字节码,由 Java 解释器加载执行字节码。 Java Applet 没有 main() 方法作为程序入口,是嵌在.
Java 程序设计 案例教程 北京大学出版社 第 01 章. Java 程序设计案例教程 第 01 章 Java 语言与面向对象程序设计 Java 语言的历史 Java 语言的特点 Java 程序的分类 Java 环境配置 Eclipse 的安装 Java 程序的调试 教学目标.
第九章补充 图形图像编程基础 主要内容: 1 、图形操作 2 、图象操作 3 、播放声音 重点: 掌握 Java2D 、 ImageIo 的使用 难点: 了解 JMF.
软件编程基础 Java Applet 是另一类非常重要的 Java 程序, 虽然它的源代码编辑与字节码的编译生成过程与 Java Application 相同,但它却不是一类可以独立运 行的程序,相反,它的字节码文件必须嵌入到另一 种语言 HTNI 的文件中并由负责解释 HTML 文件的 WWW 浏览器充当其解释器,来解释执行.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第1章 Java语言概述.
《 Java开发环境配置》 主讲人:耿力.
Java 2实用教程(第3版)教学课件 主讲教师:张国平
第八章:网络应用制作技术 本章介绍网络各种应用中所涉及的基本概念和制作技术,包括HTML、网页的制作、Java、Java Script语言的初步基础,VRML语言的基本功能,以及网络环境下分布式数据库系统和客户服务体系的构造方法及技术。
Java程序设计教程 第一讲 Java概述.
Hello小程序的运行和编译 Java AppletJava小程序的构成 1、关键字
第19讲 applet程序设计 1/.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第十二章 Java Applet.
Java Applet的运行原理 在网页向Java Applet传值 在Java Applet中播放声音 在Java Applet中使用组件
第11章 Java多媒体技术.
面向对象技术Java Object-Oriental Technology Java
第三部分 Java语言编程应用篇 第6章 Java语言的 图形用户界面开发技术 (之二).
Oracle数据库 Oracle 子程序.
第6章 网页图像处理 通过本章学习,应该掌握以下内容: 能够选择合适的网页颜色 了解网页图像的基本格式 掌握使用网页图像的要点
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
第九章 字符串.
Ch02 視窗Swing套件 物件導向系統實務.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
Java语言程序设计 清华大学出版社 第9章 网络通信.
Java Applet 介绍.
Ch07 Java Applets 物件導向系統實務.
2018/11/20 第一章 Java概述 武汉大学计算机学院计算机应用系 2018/11/20 14:33.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
走进编程 程序的顺序结构(二).
辅导课程六.
第八章 Applet小应用程序.
Java语言程序设计 第八部分 Applet小程序.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
C/C++/Java 哪些值不是头等程序对象
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第七章 操作符重载 胡昊 南京大学计算机系软件所.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
第四章 团队音乐会序幕: 团队协作平台的快速创建
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
分裂对象模型 C++ otcl.
项目二:HTML语言基础.
Interfaces and Packages
2019/5/3 JAVA Socket(UDP).
iSIGHT 基本培训 使用 Excel的栅栏问题
_13简单的GDI绘图操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
辅导课程十五.
第6章 面向对象的高级特征 学习目标 本章要点 上机练习 习 题.
Python 环境搭建 基于Anaconda和VSCode.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
Java语言程序设计 清华大学出版社 第6章 java图形与图像处理.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
Applet.
只要功夫深 铁杵磨成针 —— 写在前面的话.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
5.1 Applet的基本概念 5.2 Applet的编写 5.3 Applet的多媒体支持
Summary
Presentation transcript:

第九讲 Java Applet 1、所有小应用程序的根源 2、小应用程序的执行 3、图形操作 4、播放声音 5、图象操作 6、动态效果 7、小应用程序的通信 8、系统属性

1、所有小应用程序的根源 Java小应用程序(Java Applet)是使用Java语言编写的一段代码,它能够在浏览器环境中运行。 Applet与Application地主要区别在于它们的执行方式不同:Application是使用命令行命令直接运行,从其main()方法开始运行的;而Applet则是在浏览器中运行的,首先必须创建一个HTML文件,通过编写HTML语言代码告诉浏览器载入何种Applet以及如何运行,再在浏览器中给出该HTML文件的URL地址即可,Applet本身的执行过程也较Application复杂。

1、所有小应用程序的根源 Applet其实是一种能够在浏览器(Web)中运行的特殊的图形用户界面程序。 回忆一下小应用程序的书写格式 import java.applet.*; public class MyApplet extends Applet{ … ; } 每一个小应用程序都继承自java.applet.Applet类,并且每个小应用都有一个主程序类,之前必须加上public。 Applet其实是一种能够在浏览器(Web)中运行的特殊的图形用户界面程序。

2.1 所有小应用程序的根源 http://someLocation/file.html 1. Browser loads URL <Html> <Applet code= ….> </Applet> 2. Browser loads HTML document Applet class 3. Browser loads applet classes Location: http://someLocation/file.html Loading... 4. Browser run applet

1、所有小应用程序的根源 小应用程序的限制 Browser SERVER connection applet被下载的 applet file 本地程序 file local connection applet被下载的 与applet无关的 本地方法

1、所有小应用程序的根源 看看我们以前学过的一个简单例子: HelloApplet.java import java.applet.*; import java.awt.*; public class HelloApplet extends Applet { public String s; public void init() s = new String(“Hello World!”); } public void paint(Graphics g) g.drawString(s,25,25); <HTML> <HEAD> <TITLE>Hello World</TITLE> </HEAD> <applet code="HelloApplet.class" width=300 height=300> </applet> </HTML> HelloApplet.java

2、小应用程序的执行 ——Applet的运行控制 Applet的运行控制 Java.applet.Applet public void init() public void destroy() public void start() public void stop() public void paint(Graphics g)

2、小应用程序的执行 ——Applet的运行控制 Applet的生命周期 初始态(瞬态) 运行态 停止态 消亡态 离开Web页面:极小化或装入其他页面,调用stop()方法 重新装入或改变页面大小或返回Web页面,调用start()方法 关闭浏览器,调用stop()、destroy()方法 第一次装入,构造applet类,调用init()方法 调用start()方法

2、小应用程序的执行 ——Applet的运行控制 Applet中没有main()方法。当Applet被浏览器运行时, init() 、start()、stop()、destroy()方法等自动执行: init()方法:初始化,自动调用,只执行一次。本方法主要完成一些在Applet构造方法所不能完成的工作。 start()方法:初始化后,重入等都将自动调用。本方法是Applet的主体,在其中可以执行一些任务或启动相关的线程来执行任务。 stop()方法:离开Applet所在页面时调用,以停止消耗系统资源。 destroy()方法:浏览器关闭时自动调用,以清除Applet所用的所有资源。

2、小应用程序的执行 ——Applet的运行控制 SimpleApplet.java public class SimpleApplet extends Applet { StringBuffer buffer; public void init() buffer = new StringBuffer(); addItem("initializing... "); } public void start() addItem("starting... "); public void stop() addItem("stopping... "); public void destroy() { addItem("preparing for unloading(destroy)..."); } void addItem(String newWord) System.out.println(newWord); buffer.append(newWord); repaint(); public void paint(Graphics g) g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); g.drawString(buffer.toString(), 5, 15); SimpleApplet.java

2、小应用程序的执行 ——Applet的运行控制 除了四个Applet生命周期控制的方法外,Applet类还提供了一些其他有用的方法: public AppletContext getAppletContext() public String getAppletInfo():应该被重写 public URL getDocumentBase() public URL getCodeBase() public String getParameter(String name) public String[][] getParameterInfo() :应该被重写 public void showStatus(String msg) public boolean isActive()

2、小应用程序的执行 ——Applet与HTML HTML中applet标签的使用 < APPLET [ARCHIVE = archiveList ] [CODEBASE = codebaseURL] CODE = appletFile [ALT = alternateText] [NAME = appletInstanceName] WIDTH = pixels HEIGHT = pixels [ALIGN = alignment] [VSPACE = pixels] [HSPACE = pixels] > [< PARAM NAME = appletParameter1 VALUE = value >] [< PARAM NAME = appletParameter2 VALUE = value >] . . . [alternateHTML] </APPLET>

2、小应用程序的执行 ——Applet与HTML ARCHIVE = archiveList [File1, File2, …] CODEBASE = codebaseURL 指明Applet类文件所在URL基址,在Applet类中,方法getCodeBase()可以获取该属性。如果这个属性没有指明,那么Applet类文件必须与包含它的HTML页面在同一个地方,方法getCodeBase()返回的值与getDocumentBase()相同。 CODE = appletFile 指明需要运行的Applet类文件(.class文件),该文件是与codebaseURL相关的。 NAME = appletInstanceName 给出了Applet类运行时的实例名,这使得同处于一个页面的不同Applet之间能够相互通信。方法getAppletContext()可以得到同一个方页面中其它Applet类。

2、小应用程序的执行 ——Applet与HTML

2、小应用程序的执行 ——Applet与HTML ALT = alternateText 如果浏览器支持Applet但不能运行它,就显示alternateText中所给出的文字。否则就忽略它。 WIDTH = pixels HEIGHT = pixels Applet在浏览器中所显示的高度和宽度(以象素为单位)。 ALIGN = alignment Applet在浏览器中显示时的对齐方式,其含义与效果与图片在HTML中的一样。其取值有: left, right, top, texttop, middle, absmiddle, baseline, bottom, absbottom。 VSPACE = pixels HSPACE = pixels Applet在浏览器中显示时上下、左右要预留的高度和宽度,其含义与效果与图片在HTML中的一样。

2、小应用程序的执行 ——Applet与HTML 其它 内容 Java applet 其它内容 width height hspace vspace hspace height width

2、小应用程序的执行 ——Applet与HTML < PARAM NAME = appletParameter1 VALUE = value > <PARAM>属性可以使得Applet能够从页面中获取所需的参数。 Applet可以用其方法getParameter()获取<PARAM>属性指定的参数。 <PARAM>属性的作用与应用程序中main()方法里参数String args[]的作用是一样的。 一个好的小应用程序,应该提供用户能够设置外部参数的功能,以使得用户能够根据自己的需要来应用它。方法getParameterInfo()可以得到有关<PARAM>属性的说明信息。 alternateHTML 如果浏览器不支持Applet,就解释alternateHTML所给出的HTML代码。否则就忽略它。

2、小应用程序的执行 ——Applet与HTML AppletPara.java <HTML> <HEAD> public class AppletPara extends Applet { String s1,s2; public void init() s1 = getParameter("p1"); s2 = getParameter("p2"); } public void paint(Graphics g) g.drawString(s1,10,10); g.drawString(s2,10,30); <HTML> <HEAD> <TITLE>Applet Parameter Test</TITLE> </HEAD> <applet code=“AppletPara.class" width=300 height=300> <param name=p1 value="1111111"> <param name=p2 value="2222222"> </applet> </HTML> 两个步骤: 在Applet类中: s1 = getParameter("p1"); 在页面中设置Applet参数: <param name=p1 value="1111111"> AppletPara.java

2、小应用程序的执行 ——Applet与Application 一个Java类文件可以既是一个Java Applet,又是一个Java Application,只不过在编写时稍微复杂一些而已,但它却既可以在浏览器中运行,又可以作为Application单独运行。 public static void main( String args[] ) { Frame f = new Frame(“Applet-App”); AppletApp app = new AppletApp(); f.add(app, “Center”); f.setSize(200, 200); f.setVisible(true); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); app.init(); app.start(); public class AppletApp extends Applet { public String s; public void init() s = new String(“Hello World!”); } public void paint(Graphics g) g.drawString(s,25,25); AppletApp.java

2、小应用程序的执行 ——Java Applet浏览器 Java Applet浏览器是指可以运行包含Applet的HTML文件的一切软件系统。HotJava、Netscape Navigator以及Microsoft Internet Explorer等支持Java的网络浏览器都是Applet浏览器,Java Applet都可以在其中运行。 AppletViewer是一个Java应用程序,它可以使得用户无须使用网络浏览器而直接运行Java Applet。但AppletViewer仅仅是一个Applet浏览器,HTML文件中的其他内容将不会被显示出来。 AppletViewer是从java.awt.Frame中继承而来。 使用方法:AppletViewer <HTML file or URL>

2、小应用程序的执行 ——Java Applet浏览器 Java Applet浏览器和AppletViewer与前面介绍的AppletApp的原理是一样的,只不过前两者更具有通用性,它们通过一个包含Applet的HTML文件来告诉它们该如何使用Applet,在其内部,有一个解释器,解释HTML文档内的<Applet>标签,获得Applet类及相关参数,然后创建Applet实例,调用相关方法,……

——paint()、update()和repaint() 3、图形操作 ——paint()、update()和repaint() Applet本身是一个AWT组件,因此它也具有一般AWT组件的图形绘制功能。Applet中有三个显示相关的方法:paint()、update()和repaint()。 Applet的显示更新是由一个AWT线程来控制完成的,它主要负责两种显示更新情况:第一是暴光,表示部分显示区域被遮盖、调整大小、最大最小化等,这种情况随时会发生,需要系统调用paint()方法;第二是程序需要重画显示区域,添加一些新的显示内容,需要程序调用repaint()方法。

——paint()、update()和repaint() 3、图形操作 ——paint()、update()和repaint() AWT thread(waiting) update(): clear area call paint() paint() 程序调用 repaint() Exposure: 遮盖、调整大小、最大最小化等

——paint()、update()和repaint() 3、图形操作 ——paint()、update()和repaint() paint( Graphics g )方法 Applet本身是一个容器,因此任何输出都必须用图形方法paint()。当小应用首次被装载,以及每次窗口放大、缩小、刷新时都要调用paint()方法。paint()是由AWT线程调用的,而不是由程序调用,当程序希望调用paint方法时,用repaint()方法。 paint()方法的参数是Graphics类的对象 g,该对象不是由new产生的,而是由系统或其他方式直接将生好的Graphics对象当作方法的参数,再交给paint()方法。 paint()方法必须被重写以绘制自己所需的内容。

——paint()、update()和repaint() 3、图形操作 ——paint()、update()和repaint() update()方法 update()方法用于更新图形。它首先清除背景,然后设置前景,再调用paint()方法完成Applet中的具体绘图。一般不要重写update()方法。 repaint()方法 repaint()方法主要用于重绘图形,它是通过调用update()方法来实现图形重绘的。当组件外形发生变化时,系统自动调用repaint()方法。一般不要重写repaint()方法。 AWT线程要处理组件的绘图工作,并负责其输入事件,因此必须尽量缩短paint()方法和update()方法的长度,特别是在paint()方法中,不要执行太消耗时间的操作。

——Graphics、Font和Color类的使用 3、图形操作 ——Graphics、Font和Color类的使用 在paint()方法中有一个Graphics类参数,它是画图的关键。它支持两种绘制:一是基本的绘图,包括画点、线、矩形、文字等;二是画图象。在进行基本画图时,可以设定所需的颜色和字体等,这需要用到Font、FontMetrics和Color三个类。 有关这几个类的使用以及相互关系,请大家课后自己学习。

Applet本身是一个AWT组件,因此可以对其中所发生的事件进行处理,其处理与前面所讲的图形用户界面程序的设计是一样的。 3、图形操作 ——Applet中的事件处理 Applet本身是一个AWT组件,因此可以对其中所发生的事件进行处理,其处理与前面所讲的图形用户界面程序的设计是一样的。 SimpleClick.java

往Applet中添加其他AWT组件及其事件处理与前面所讲的图形用户界面程序的设计是一样的。 3、图形操作 ——添加其它AWT组件 Applet是从java.awt.Panel继承而来,因此它本身也是一个容器,可以往其中添加其他的AWT组件,从而构造更复杂、更有用的Applet程序。 往Applet中添加其他AWT组件及其事件处理与前面所讲的图形用户界面程序的设计是一样的。 ArcTest.java

4、播放声音 Java语言提供了播放声音的方法,但目前Java核心类包中只支持“*.au”格式的声音(扩展类包和其他第三方类包可以支持更多地声音格式),而且只有在Applet中才能播放声音,Application中是不行的。有两种方法可以在Applet中实现播放声音。 第一种方法是利用Applet类提供的方法直接播放声音: public void play(URL url) public void play(URL url, String name) 例:play( getCodeBase(), “boing.au”); 但这两个方法是一次性播放的,不能反复播放。要想反复播放,就必须使用第二种方法。

4、播放声音 第二种方法是利用接口java.applet.AudioClip和Applet类一起实现声音播放。接口AudioClip中有三个方法: public void play():播放一遍 public void loop() :循环播放 public void stop() :停止播放 AudioClip是一个接口,因此不能直接new出一个声音对象实例,它必须和Applet类一起使用,利用Applet类提供的声音装载方法载入一个声音文件,形成一个声音对象实例: public AudioClip getAudioClip(URL url) public AudioClip getAudioClip(URL url, String name) 装载的声音文件后,就可以得到一个实现了AudioClip接口的类的实例,通过该实例,利用AudioClip的方法就可以来进行声音操作了。

4、播放声音 SoundPlay.java SoundPlay1.java public class SoundPlay extends Applet { AudioClip sound; public void init() try sound = getAudioClip(getDocumentBase(), "spacemusic.au"); }catch(Exception e){} } public void start() sound.loop(); public void paint(Graphics g) g.drawString(“正在播放音乐...” + "spacemusic.au", 5, 10); public void stop() sound.stop(); 4、播放声音 public class SoundPlay1 extends Applet { public void start() play(getDocumentBase(), "spacemusic.au"); } public void paint(Graphics g) g.drawString(“正在播放音乐...” + getDocumentBase() + ": spacemusic.au", 5, 10); SoundPlay1.java SoundPlay.java

5、图象操作 在Java中,其类包java.awt,java.awt.image和java.applet中都提供了支持图象操作的类和方法。对图象的操作包括载入、生成、显示和处理。在Java中,图象信息是封装在抽象类Image中的,目前Java核心类包支持gif和jpeg两种格式的图象(但在扩展类包中可以支持更多地图象格式)。类Image是一个抽象类,因此不能直接new出一个图象对象,需要采用特殊的方法载入或生成图象对象(与AudioClip相似)。 图象操作在Applet和Application中都可以进行。

URL picurl= new URL (“http://xxx.yyy.edu/Applet/img1.gif”); 5、图象操作 ——载入现有图像文件 在Applet中和Application中有不同的图象载入方法: 对于Applet,由于它主要在网络上运行,因此网络上图像文件需要用URL形式描述来: URL picurl= new URL (“http://xxx.yyy.edu/Applet/img1.gif”); 在Applet中提供了两个方法来载入图象对象: public Image getImage(URL url) public Image getImage(URL url, String name) 例如: Image img1 = getImage(picurl); Image img2 = getImage(getCodeBase(), “img2.gif”);

5、图象操作 ——载入现有图像文件 对于Application,必须通过java.awt类包中的类Toolkit提供的方法来载入图象: public abstract Image getImage(String filename) public abstract Image getImage(URL url) Toolkit也是一个抽象类,不能直接生成,有两种方法可以获得其对象实例:一是通过Toolkit类的静态方法getDefaultToolkit(),二是用任意一个组件对象实例的方法getToolkit() [在Applet中获得图像的方法就是这样实现的]。 例如: Image img1 = Toolkit.getDefaultToolkit().getImage(picurl); Image img2 = xxxCom.getToolkit().getImage(“img2.gif”);

5、图象操作 ——载入现有图像文件 在载入图象时,对于Applet或Application而言,方法getImage()都是立即返回,它生成了一个新的线程在后台异步地完成图象载入任务,使得程序可以执行其他操作。如果需要对图象的载入情况进行跟踪,可以使用类MediaTracker或接口ImageObserver。 MediaTracker可以同时实现对图象的同步或异步跟踪: MediaTracker tracker = new MediaTracker( Component xxxCom ); tracker.addImage( img, id ); 利用MediaTracker的方法checkID(int),checkAll(),statusID(int)和statusAll()可以异步跟踪图象的载入情况;利用方法waitForID(int)和waitForAll()可以同步跟踪图象的载入情况。

5、图象操作 ——载入现有图像文件 ImageObserver是一个接口,它定义了一个方法来异步获取图象载入情况数据: boolean imageUpdate( Image img, int infoflags, int x, int y, int width, int height ); 该方法会自动根据引用包含实现其接口的类实例的方法的执行而执行。 所有的组件都实现了接口ImageObserver,这就是为什么MediaTracker的构造方法中需要一个Component实例的原因,MediaTracker也是通过ImageObserver来获取图像载入信息的.

5、图象操作 ——载入现有图像文件 在调用某些图像操作的方法如Graphics的显示图像方法drawImage()、Image的getWidth()和getHeigth()方法等时,需要给出ImageObserver类型的参数,以通过ImageObserver实例中的方法获得图象载入情况数据。 public abstract int getHeight(ImageObserver observer) public abstract int getWidth(ImageObserver observer) drawImage()、getWidth()和getHeigth()方法在执行时会自动调用ImageObserver 的imageUpdate()方法来确定目标图像的动态装载信息的。

5、图象操作 ——显示图像 显示图象是通过类Graphics的方法来实现的: public abstract boolean drawImage(Image img, int x, int y, ImageObserver obs) int width, int height, ImageObserver obs) Color bgcolor, ImageObserver obs) int width, int height, Color bgcolor, ImageObserver obs) 在显示图象时,会调用obs中的方法imageUpdate()以判断图象的载入情况并做相应的处理。方法drawImage()在显示了已经载入的图象数据后立即返回,因此图象还没有完全载入前,其显示是不完整的,但可以使用MediaTracker类来使得图象完全载入后再显示。 所有的组件都实现了接口ImageObserver,因此任意给一个组件实例即可.

ImageDisplayer.java public class ImageDisplayer extends Applet { Image img; int imgWidth, imgHeight; public void init() img = getImage(getDocumentBase(), "BALL_ANI.GIF"); MediaTracker tracker = new MediaTracker(this); tracker.addImage( img, 0 ); try{ tracker.waitForID( 0 ); }catch(Exception e){} imgWidth = img.getWidth(this); imgHeight = img.getHeight(this); } public void paint(Graphics g) //Draw image at its natural size first. g.drawImage(img, 0, 0, this); //Now draw the image scaled. g.drawImage(img, imgWidth, 0, imgWidth+100, imgHeight+100, this); ImageDisplayer.java

5、图象操作 ——在Applet中显示图像的完整过程 不要忘记AWT包 定义Image对象了吗? 指定图像的URL了吗? 把图像取出来吧. 还记得画图像用什么方法和命令吗? 在类中 在init()中 在paint()中

5、图象操作 ——图像和声音的结合 图像加声音结合在一起可以使得程序更加有吸引力。 1. 在init()中既取图像也取声音片断 Image img = getImage(getCodeBase(), "img.gif"); AudioClip sound = getAudioClip(getCodeBase(),"boing.au"); 2. 在start()中加入 sound.loop(); 3. 在paint()中加入 g.drawImage( img, 0,0, obs); 4. 在stop()中加入 if ( sound != null ) sound.stop(); ImageSound.java

5、图象操作 ——其他图象处理 在类包java.awt.image中,还有很多关于图象生成和图象处理的类: 图象生成:接口ImageProducer,类FilteredImageSource和MemoryImageSource等。 图象处理:类ImageFilter及其子类CropImageFilter和RGBImageFilte等。 这些类的使用,请大家课后自己学习。

6、动态效果 先看一个简单的动态效果的例子:简单时钟 无论在Applet中还是在Application中,实现动态效果的关键是使用线程。 SimpleClock.java 开始 Applet 主控 线程1 线程3 不断刷新 Applet中 显示内容 AWT 绘图 线程2 无论在Applet中还是在Application中,实现动态效果的关键是使用线程。

6、动态效果 在Applet中实现一个线程: 让Applet类去实现Runable接口,创建一个线程类 改写方法start,在其中产生一个新的线程来工作 改写stop方法,在其中编写结束线程的程序代码 引入新的方法,将分给线程的工作写到run中

6、动态效果 第一步:实现Runable接口 Thread是一个类,只有是它的实例才能具有线程的功能。 在主函数中要定义一个线程变量。 public class xApplet extends Applet implements Runnable { Thread animatorThread = null; … } Thread是一个类,只有是它的实例才能具有线程的功能。 在主函数中要定义一个线程变量。

6、动态效果 第二步:改写方法start 第三步:改写stop方法 public void start() { if( animatorThread == null ) animatorThread = new Thread(this); animatorThread.start(); //从现在开始程序多了一个线程在执行 } 第三步:改写stop方法 public void stop() smallthread.stop(); //停止线程 smallthread = null; //释放线程对象

6、动态效果 第四步:新的方法run,控制线程的运行。

6、动态效果 一个标准的动态效果控制流程 public void run() { //降低线程的优先级,以免它干扰正常的处理 Thread.currentThread().setPriority(Thread.MIN_PRIORITY); //记住线程的起始时间,用于控制动态效果的延迟 long startTime = System.currentTimeMillis(); //动态效果循环控制 while (Thread.currentThread() == animatorThread) [根据需要设置更新显示内容的变量或用其他方式] //确定刷新内容 repaint(); //重画 try { //动态效果延迟 startTime += delay; // delay为两次显示更新之间的时间间隔 Thread.sleep(Math.max(0, startTime-System.currentTimeMillis())); } catch (InterruptedException e) { } }

6、动态效果 ——显示动态文字 1、显示动态文字 MovingText.java 2、文字颜色变换 ColoringText.java

6、动态效果 ——穿越屏幕的显示 穿越屏幕的图形 … FlashingGraphics1.java

6、动态效果 ——解决图象抖动 重写update()方法 在update()方法中不进行背景清除。 双缓冲技术 生成一幅后台图象 offImage = createImage(d.width, d.height); offGraphics = offImage.getGraphics(); 清空后台图象 offGraphics.setColor( getBackground() ); offGraphics.fillRect(0, 0, d.width, d.heigth); 往后台图象中添加内容 offGraphics.drawImage() offGraphics.drwaLine() …… 在屏幕上一次性绘出已经准备好的后台图象 g.drawImage( offImage, …… );

6、动态效果 ——解决图象抖动 1、穿越屏幕的图形 FlashingGraphics.java 2、穿越屏幕的图象 MovingImage.java

6、动态效果 ——播放动画 在Java中播放动画 1、需要多幅图象 int allFrame = 10; Image images[]; 2、将多幅图象存入图象对象数组 images[] = new Image[allFrame]; for( int i = 0; i < allFrame; i++ ) images[i]=getImage(getCodeBase(), “T” + i + “.gif”); 3. 根据一定的时间间隔显示不同的图像 g.drawImage(images[i], 0, 0, this); MovingPenguin.java

6、动态效果 ——特殊图象显示 1、图象的逐步放大显示 SpecialImage.java 2、图象的左右翻转:在宽度方向逐渐压缩或逐渐扩大 TurnImage.java

public AppletContext getAppletContext(); 7、小应用程序的通信 ——同页Applet之间的通信 嵌入同一页中的Applet之间可以通过java.applet包中提供的方法直接进行通信。 首先,利用Applet类中的方法getAppletContext()得到当前运行页的上下文环境AppletContext对象: public AppletContext getAppletContext(); 通过AppletContext对象,就可以得到当前Applet运行环境的信息。 接口AppletContext中定义了方法getApplets()可以得到当前页中的其他Applet对象。 public abstract Applet getApplets(String name); public abstract Enumeration getApplets(); (Enumeration中提供了方法hasMoreElements()和nextElement()来获取其中的元素。) 得到同页中的其他Applet对象后,就可以调用这些Applet的public方法,从而达到同页Applet之间通信的目的。

7、小应用程序的通信 ——同页Applet之间的通信 三个Applets: GetApplets:获取同页中其它Applets的信息。 Sender:获取同页中的Applet “Receiver”,并通过其方法向它发送消息。 Receiver:接收同页中Applet “Sender”的消息。 <HTML> <HEAD> <TITLE>Communication among Appelt in same page.</TITLE> </HEAD> <applet code=Sender.class width=450 height=200 name=“the Sender"> <param name=“myName" value="I'm Receiver"> <param name="receiverName" value=“the Receiver"> </applet> <p> <applet code=Receiver.class width=450 height=35 name=“the Receiver”> <param name="name" value="I'm Receiver"> <applet code=GetApplets.class width=400 height=150> </HTML>

7、小应用程序的通信 ——Applet和浏览器之间的通信 Applet中提供了很多函数来与显示它的浏览器之间进行通信: public URL getCodeBase() public URL getDocumentBase() public String getParameter(String name) public void showStatus(String msg) public AppletContext getAppletContext() Applet可以用这四个方法从浏览器中获取信息或者向浏览器发送信息。 public String[][] getParameterInfo() public String getAppletInfo() 浏览器可以使用Applet的这两个方法来获取Applet的相关信息。

7、小应用程序的通信 ——Applet和浏览器之间的通信 public AppletContext getAppletContext() 同一页面不同Applet之间的通信也是要通过这个方法来获得起运行环境的(AppletContext),再利用AppletContext提供的方法getApplet()来获取其它的Applet从而达到相互通信的目的。 AppletContext中还提供了showDocument()方法来向浏览器发送请求,以显示一个URL页面: void showDocument( URL url) void showDocument( URL url, String target )

7、小应用程序的通信 ——Applet和浏览器之间的通信 void showDocument( URL url) 指定的HTML页面将在Applet所在地浏览器窗口中显示。 void showDocument( URL url, String target ) 在本方法中,可以指明显示HTML页面的窗口,target就是用来指明在浏览器窗口的,不同的取值指明了不同的窗口: “_self”: 在Applet所在的窗口中显示HTML页面 “_parent”: 在Applet所在的窗口的父窗口中显示HTML页面 “_top”: 在最前面的窗口中显示HTML页面 “_blank”: 在新的窗口中显示HTML页面 name: 在指定名称的窗口中显示HTML页面 ShowDocument.java

7、小应用程序的通信 ——Applet的网络通信 在Applet中可以进行网络通信,但是由于安全性的限制,Applet只能和提供它的主机进行通信。 通过类Applet的getCodeBase()方法获得提供它的主机的URL实例 利用类URL的getHost()方法得到主机名 利用类InetAddress的getByName()得到该主机的IP地址 通过IP地址,就可以进行网络通信(TCP, UDP) URL url = getCodeBase(); String host = url.getHost(); Try{ InetAddress address = InetAddress.getByName(host); }catch(Exception e){} DatagramSocket socket = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(buf, length, address, port); socket.send(packet);

Key Meaning 8、系统属性 在System类中,提供了一个类方法: 来获取系统属性, 系统属性包括: "file.separator" File separator (for example, "/") "java.class.path" Java classpath "java.class.version" Java class version number "java.home" Java installation directory "java.vendor" Java vendor-specific string "java.vendor.url" Java vendor URL "java.version" Java version number "line.separator" Line separator "os.arch" Operating system architecture "os.name" Operating system name "os.version" Operating system version "path.separator" Path separator (for example, ":") "user.dir" User's current working directory "user.home" User home directory "user.name" User account name 8、系统属性 在System类中,提供了一个类方法: String getProperty(String) 来获取系统属性, 系统属性包括: GetSystemProp.java

Key Meaning 8、系统属性 在Applet中,可以获取以下系统属性: "file.separator" File separator (for example, "/") "java.class.version" Java class version number "java.vendor" Java vendor-specific string "java.vendor.url" Java vendor URL "java.version" Java version number "line.separator" Line separator "os.arch" Operating system architecture "os.name" Operating system name "path.separator" Path separator (for example, ":")

Key Meaning 8、系统属性 在Applet中,以下系统属性是不能获得的。 Java classpath "java.home" Java installation directory "user.dir" User's current working directory "user.home" User home directory "user.name" User account name

小结 小应用程序是在浏览器中运行的,每个小应用程序中必须有一个主类,冠以public,并且继承自java.applet。 小应用程序包括生命周期的四个环节和paint()方法。 根据程序要求,用户可以在主类中定义其它方法,或定义其它类。 public class myapplet extends Applet { init() {…} start() {…} stop() {…} destroy() {…} paint(Graphics g){…} myMethod(){…} } class myclass1{…}; class myclass2{…};

init() applet 主类 start() paint() stop() destroy() . 自定义方法 myClass1 浏览器变换页面时执行,可以省略、重写 浏览器关闭时执行,可以省略重写 不能自动被执行,可以由前三个方法调用。例如: start() { … myMethod(); …} myClass1 myMethod1 myMethode2 myClasse1 myclass =new myClass1(); myclass1.myMethod1(); .

Demo Instance test1 v1 20 test2 10 内存 class myClass1 { int v1; public void myMethod(int num) v1=num; } test1 public class Demo extends Applet public void init() myclass1 test1=new myClass1(); test1.myMethod(20); myClass1 test2 = new myClass1(); test2.myMethod(10); v1 test2 20 10 内存 Demo Instance

小结 线程是实现动态效果的核心,运行线程必须继承Thread类或者实现Runable接口。 run 是线程的主体,它反复调用repaint()方法,其中必须有休眠sleep()。 sleep()语句要捕获中断异常。 有线程的小应用,start()、stop()方法必须重写。 需要获取网络资源时(包括本地资源),要用URL类。

小结 设计一个Applet,应: 使用getParameter()方法,以便用户能够自定义Applet的运行参数。 重写getParameterInfo()方法,帮助用户得到外部参数的说明信息。 重写getAppletInfo()方法,帮助用户得到有关Applet的说明信息。 准备提交一个Applet之前,应: 去掉(隐去)调试信息 一定要在stop()方法中终止一些消耗资源的运行。

下一讲内容 1、Java与Internet 2、使用URL 3、Socket通信 4、数据报通信