51
Java 程程程程程程程程程程程程程程程程程程 程程程程[email protected] 程程程程

《Java 程序设计之网络编程 》

  • Upload
    helga

  • View
    112

  • Download
    4

Embed Size (px)

DESCRIPTION

《Java 程序设计之网络编程 》. 教学课件. 重庆大学计算机学院 电子邮件: [email protected]. - PowerPoint PPT Presentation

Citation preview

Page 1: 《Java 程序设计之网络编程 》

《 Java 程序设计之网络编程》

重庆大学计算机学院电子邮件: [email protected]

教学课件

Page 2: 《Java 程序设计之网络编程 》

第 12 章 Applet 应用程序 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 虚拟机上运行。

Page 3: 《Java 程序设计之网络编程 》

• 12.1 Applet 程序设计基础 • 12.2 java.applet 包 。• 12.3 Applet 中的多媒体应用• 12.4 Applet 中的鼠标和键盘事件

主要内容 :

Page 4: 《Java 程序设计之网络编程 》

12.1 Applet 程序设计基础 • 12.1.1 加载 Applet • Applet 是 Java 语言的又一应用形式。它没有 main 方法,因而不能由解释器直接解释执行。• 为了运行它,我们需要把它放进 Web 页面。当这个页面在浏览器上显示时, Applet 就在页面中指定的一部分区域内显示其运行结果。

Page 5: 《Java 程序设计之网络编程 》

Http: / / someLocati on/fi l e. html

Appl et Cl asses

1. URL浏览器加载 地址

2. HTML浏览器加载 文件

3. Appl et浏览器加载 类

4. Appl et浏览器在本地运行

HTML文件:

<HTML>…<APPLET CODE=…></APPLET>

Locati on: Http: / / someLocati on/fi l e. html

Loadi ng …

Page 6: 《Java 程序设计之网络编程 》

12.1.2 Applet 的安全性限制 • Applet 程序的执行需要从 Internet 上将 Ap

plet 的伪代码下载到本地系统运行,因此 Applet 在给人们带来好处的同时,也带来了潜在的安全隐患。

• 为了防止这样的问题出现,在缺省的情况下,大多数浏览器在 Applet 安全方面受到诸多的限制,几乎不能对系统进行任何“读”或“写”的操作。

Page 7: 《Java 程序设计之网络编程 》

• 不允许 Applet 运行时执行另一程序。• 不允许 Applet 访问本地文件系统。• Applet 不能执行任何本地计算机上的程序。• 不允许 Applet 尝试打开除提供 Applet 的服务器之外的任何系统的 Socket 。• 不允许 Applet 访问用户名、电子邮件地址等与本地系统有关的信息。• 对于 Applet 而言, Java 环境中的某些标准系统属性是只读的。

Page 8: 《Java 程序设计之网络编程 》

• Applet 不能创建或装载 Applet 的机器的网络连接。• Applet 不能充当网络服务器,监听或接收来自远程系统的连接请求。• 不允许 Applet 装载动态库或定义本地方法调用。• Applet 不能操纵不在自己线程组中的任何线程。• Applet 不能关闭 JVM 。

Page 9: 《Java 程序设计之网络编程 》

12.1.3 Applet 的生命周期 • Applet 由运行时系统来构造。当它所在的页面被浏览器装入后, Applet 就出生了。• 这时系统自动调用 init() 方法,进行一些必要的初始化工作。• 接着,系统将调用 start() 方法启动 Applet的执行。• 当浏览器切换到别的页面时, stop() 被调用,以终止 Applet 的执行。

Page 10: 《Java 程序设计之网络编程 》

• 假如浏览器又切换回 Applet 所在页面,那么运行时系统将从调用 start() 方法开始 Applet 的又一次运行。• 当浏览器关掉时, Applet走到了它一生的终点。• 系统将先调用 stop()停止它的执行,然后用 destroy( ) 方法来完成资源回收等收尾工作。• 如果浏览器重载页面,就会先令 Applet死亡 (依次调用 stop() 和 destroy()) ,然后装入页面 ( 调用 init()) ,开始 Appl

et 的又一次生命。

Page 11: 《Java 程序设计之网络编程 》

Appl et创建i ni t( ) Appl et运行start( )

Appl et停止

stop( )

Appl et死亡 destroy( )

切换页面

关闭浏览器

Page 12: 《Java 程序设计之网络编程 》

1. init() • 当 applet 被加载时,会首先执行 init 方法,该方法相当于 Application 程序中的 main ,该方法只能被执行一次。 Applet 可用这个方法来初始化数据的值,比如设置全局变量,初始化对象等等。该方法只在 Applet首次装入时被调用,并且在调用 start() 之前执行完成。

Page 13: 《Java 程序设计之网络编程 》

2. start() • init 方法执行完毕会就会自动执行 start 方法,

start 方法可以被反复执行,如一个 applet被 stop 后,可以使用 start 方法重新开动。该方法的执行使得 Applet成为“活动”的。无论 Applet 何时成为可见的,它同样要执行一次,如:当浏览器在被图标化后又恢复时,或者当浏览器在链接到另一个 URL后又返回含有这个 Applet 的页面时。

Page 14: 《Java 程序设计之网络编程 》

3. stop() • stop 方法是在 Applet成为不可见时被调用。该方法在当用户不注意 Applet 的时候,停止一些资源的工作以免影响系统运行效率。比如:在浏览器被图标化或链接到另一个

URL 时, Applet 会调用该方法使动画停止。

Page 15: 《Java 程序设计之网络编程 》

4. Destroy() • 当关闭包含 Applet 的浏览器窗口时,会调用该方法,以销毁 Applet 对象,释放对象占用的资源。

Page 16: 《Java 程序设计之网络编程 》

12.2 java.applet 包 • 12.2.1 Applet 类的继承关系 • Java.applet.Applet 类实际上是 java.awt.Panel 的子类。

j ava. l ang. Obj ect

j ava. awt. Component

j ava. awt. Contai ner

j ava. awt. Wi ndow j ava. awt. Panel

j ava. awt. Frame j ava. appl et. Appl et

Page 17: 《Java 程序设计之网络编程 》

• 这种层次关系显示,一个 Applet 可直接用作一个 AWT布局的起始点。因为Applet 是 Panel 的子类,所以它有一个缺省的流 (flow)布局管理器。

• Component , Container 和 Panel 类的方法被 Applet 类继承了下来。而与 Panel 不同的是, Applet 类是一个可以运行的类,创建一个 Applet 类就相当于创建一个 Applet 应用程序。

Page 18: 《Java 程序设计之网络编程 》

12.2.2 Applet 类的方法 1.有关运行环境和 Applet状态的方法 • public AppletContext getAppletContext() :用以得到与 Applet 有关的上下文 (AppletContext) 对象。此方法与访问 Applet 的执行环境有关。• public void resize(int width,int height) :重新设置 Applet 所在区域的大小。该方法重写了 Com

ponent 类的 resize() 方法。它还有一个重载方法。• public void showStatus(String msg) :用 Applet的上下文(如执行它的浏览器)来显示 Applet的状态信息。

Page 19: 《Java 程序设计之网络编程 》

• public final void setStub(Applet Stub) :用来设置与 Applet 相关的“存根” AppletStub 。除非你要构造自己的 Applet浏览器,否则不要使用它。由 final修饰符可知这个方法是不可重写的。

• public Locale getLocale() : Local 是 java.util 包中的一个类,封装与国家、语言等相等的地域信息。这个方法用于获取与 Appet 相关的 Locale 对象。

• public boolean isActive() :判断 Applet是否处于被激活的状态。

Page 20: 《Java 程序设计之网络编程 》

2.用于操作声音、图像资源的方法 • public Image getImage(URL url) :从给定的 URL获取 Image 对象,用以处理图像。• public Image getImage(URL url,String nam

e) 获取指定 URL 和名字的 Image 对象。• public AudioClip getAudioClip(URL url) :从给定的 URL获取 AudioClip 对象。

Page 21: 《Java 程序设计之网络编程 》

• 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 对象。

Page 22: 《Java 程序设计之网络编程 》

3.与生命周期有关的方法 • public void init() :做初始化工作,在 Appl

et 被装入时调用。• public void start() :启动 Applet 的运行。• public void stop() :停止 Applet 运行时被自动调用。• public void destroy() :当 Applet消亡时被自动调用,一般用来做回收资源等收尾工作。

Page 23: 《Java 程序设计之网络编程 》

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 的参数。

Page 24: 《Java 程序设计之网络编程 》

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>

Page 25: 《Java 程序设计之网络编程 》

• archive = archiveList • code = appletFile.class • width = pixels height = pixels • codebase = codebaseURL • alt = alternateText • name = appletInstanceName • align = alignment • vspace = pixels hspace = pixels • <param name = appletAttribute1 valu

e = value>

Page 26: 《Java 程序设计之网络编程 》

【例 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>

Page 27: 《Java 程序设计之网络编程 》

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

Page 28: 《Java 程序设计之网络编程 》

12.2.4 Appletviewer • 为了简化和加速开发过程, JDK附带了一个专为查看 Applet 而设计但不支持 HTML页面查看的工具。这个工具就是 Appletvie

wer ,它使你不必使用 Web 浏览器即可运行 Applet 的一个 Java 应用程序。

Page 29: 《Java 程序设计之网络编程 》

12.2.5 Applet 的显示 • 除了基本的生命周期外, Applet还有与其显示有关的一些重要的方法,包括: paint

() 、 repaint() 和 update() 方法。这些方法是 Applet 显示和刷新的重要工具,它们的声明和文档在 AWT 组件类中。 Applet 的更新显示都是由 AWT 线程来独立控制完成。

Page 30: 《Java 程序设计之网络编程 》

12.3 Applet 中的多媒体应用 • 12.3.1URL • URL ( Uniform Resoure Locator :统一资源定位器)是 Internet 上各种资源的定位地址。在 Jav

a 语言中 URL 类封装了多个 URL ,一般有两种方法创建一个 URL 对象:• URL u=new URL(“http://java.sun.com/index.htm

l”);• URL data=new URL(u,”data/planets.dat”);

Page 31: 《Java 程序设计之网络编程 》

• 第一种方法向 URL 构造器传递一个字符串,且指定了整个资源的名称,因此称为绝对 URL 。第二种方法可以产生相对 URL ,它指定的 planets.dat 文件位于 URL 对象 u 的 data 子目录中。• 在 Applet 类中有两个方法可以获得对象的 URL :• public URL getCodeBase() :返回 App

let 所在的文档的 URL 。• public URL getDocumentBase() :返回 Applet 所在的 HTML 文档的 URL 。

Page 32: 《Java 程序设计之网络编程 》

12.3.2 加载图像 • Applet 类中,加载图像文件的方法有两个:• public Image getImage(URL url) :从给定的 URL获取 Image 对象,用以处理图像。• public Image getImage(URL url, String na

me) 获取指定 URL 和名字的 Image 对象。

Page 33: 《Java 程序设计之网络编程 》

• Graphics 类中显示图像文件的方法也有两个:• drawImage(Image img, int x, int y, Ima

geObserver obs) :在指定的位置显示图像对象 img 。• drawImage(Image img, int x, int y, int

width, int height, ImageObserver obs) :将图像对象 img缩小或放大到指定大小,并在指定位置显示图像。

Page 34: 《Java 程序设计之网络编程 》

【例 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); } }

Page 35: 《Java 程序设计之网络编程 》

• HTML源程序• <HTML>• <applet code= display_image.class width=

600 height=250 >• </applet>• </HTML>

Page 36: 《Java 程序设计之网络编程 》

12.3.3播放声音 • 播放一段声音文件的最简单的方式是通过 A

pplet 的 play 方法:• public void play(URL url) :用于演奏指定

URL 的 AudioClip 对象。• public void play(URL url,String name) :用于演奏指定 URL 和名称的 AudioClip 对象。

Page 37: 《Java 程序设计之网络编程 》

【例 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"); } }

Page 38: 《Java 程序设计之网络编程 》

AudioClip 类 • 1)装入一段 Audio Clip• 要转载一个声音文件,必须先通过指定的声音文件生成一个 AudioClip 对象。在 Applet 中有两种方法可以获取声音文件并生成一个 AudioClip 对象:• public AudioClip getAudioClip(URL url) :从给定的 URL获取 AudioClip 对象。• public AudioClip getAudioClip(URL url,String na

me) :获取指定 URL 和名字的 AudioClip 对象,这两个方法用以处理声音。

Page 39: 《Java 程序设计之网络编程 》

• 2)播放 AudioClip 对象• 一旦一段 clip 被装载,可选择与之相关的三个方法之一: play , loop ,或 stop• play() :将已装入的 AudioClip 对象播放一遍。• loop() :启动 AudioClip 对象的播放并不断循环(自动重放)。• stop()

Page 40: 《Java 程序设计之网络编程 》

【例 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(); }}

Page 41: 《Java 程序设计之网络编程 》

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(); // 开始 }}

 

Page 42: 《Java 程序设计之网络编程 》

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); //使面板显示 } }

 

Page 43: 《Java 程序设计之网络编程 》

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

Page 44: 《Java 程序设计之网络编程 》

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;}}

Page 45: 《Java 程序设计之网络编程 》

【例 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;

Page 46: 《Java 程序设计之网络编程 》

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

Page 47: 《Java 程序设计之网络编程 》

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

Page 48: 《Java 程序设计之网络编程 》

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

Page 49: 《Java 程序设计之网络编程 》

【例 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; } 

Page 50: 《Java 程序设计之网络编程 》

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(getCo

deBase(), s); }

Page 51: 《Java 程序设计之网络编程 》

// 生成键盘上的各个按键,并在 Applet 上绘制出来 key[0] = new Keyboard(Color.white, sound[0]); key[1] = new Keyboard(Color.black, sound[1]); key[2] = new Keyboard(Color.white, sound[2]); key[3] = new Keyboard(Color.black, sound[3]); key[4] = new Keyboard(Color.white, sound[4]); key[5] = new Keyboard(Color.white, sound[5]); key[6] = new Keyboard(Color.black, sound[6]); key[7] = new Keyboard(Color.white, sound[7]); key[8] = new Keyboard(Color.black, sound[8]); key[9] = new Keyboard(Color.white, sound[9]); key[10] = new Keyboard(Color.black, sound[10]); key[11] = new Keyboard(Color.white, sound[11]); key[1].setBounds(30, 0, 20, 60); add(key[1]); key[3].setBounds(70, 0, 20, 60); add(key[3]); key[6].setBounds(150, 0, 20, 60); add(key[6]); key[8].setBounds(190, 0, 20, 60); add(key[8]); key[10].setBounds(230, 0, 20, 60); add(key[10]); key[0].setBounds(0, 0, 40, 110); key[2].setBounds(40, 0, 40, 110); key[4].setBounds(80, 0, 40, 110); key[5].setBounds(120, 0, 40, 110); key[7].setBounds(160, 0, 40, 110); key[9].setBounds(200, 0, 40, 110); key[11].setBounds(240, 0, 40, 110); add(key[0]); add(key[2]); add(key[4]); add(key[5]); add(key[7]); add(key[9]); add(key[11]); }  private int height; private int width; private Keyboard key[]; private AudioClip sound[];}