Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


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

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

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

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

4 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: Loading... 4. Browser run applet

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

6 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

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

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

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

10 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

11 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()

12 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>

13 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类。

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

15 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中的一样。

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

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

18 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=" "> <param name=p2 value=" "> </applet> </HTML> 两个步骤: 在Applet类中: s1 = getParameter("p1"); 在页面中设置Applet参数: <param name=p1 value=" "> AppletPara.java

19 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

20 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>

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

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

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

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

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

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

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

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

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

30 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的方法就可以来进行声音操作了。

31 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

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

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

34 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”);

35 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()可以同步跟踪图象的载入情况。

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

37 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()方法来确定目标图像的动态装载信息的。

38 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,因此任意给一个组件实例即可.

39 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

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

41 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

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

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

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

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

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

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

48 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) { } }

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

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

51 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, …… );

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

53 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

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

55 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之间通信的目的。

56 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>

57 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的相关信息。

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

59 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

60 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);

61 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

62 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, ":")

63 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

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

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

66 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

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

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

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


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

Similar presentations


Ads by Google