1、1,第18章 applet和多媒体,2,动 因,浏览网页时,经常会看到使用Java开发的图形用户界面和动画。这些程序被称作Java applet。假设希望开发一个九宫格游戏的Java applet。该如何编写这个程序呢?,Sudoku,3,学习目标,将GUI应用程序转换为applet(第18.2节)。 在网页中嵌入applet(第18.3节)。 在Web浏览器及applet浏览器中运行applet (第18.3.1-18.3.2节)。 编写既可以作为应用程序也可以作为applet运行的Java程序 (第18.4节)。 覆盖Applet类中的方法init、start、stop和destroy (
2、第18.5节)。 从HTML中向applet传递字符串参数 (第18.6节)。 开发一个井字游戏的动画 (第18.7节)。 开发一个弹跳小球的applet (第18.8节)。 使用URL类来定位资源(图像和音频)(第18.9节)。 在Java程序中播放音频(第18.10节),4,开发applet,5,HTML标记:,6,一个简单的applet,Java Applet Demo,DisplayLabel,Run Applet Viewer,7,应用程序和applet,共同点 因为JFrame和JApplet都是Container类的子类,所以所有的用户接口组件、布局管理器和事件处理特征对两个类来
3、说都是一样的。 不同点 应用程序是Java解释器从静态main方法调用的,而applet是由Web浏览器运行。Web浏览器使用applet的无参构造函数创建一个applet实例并且通过init、start、stop和destroy方法控制和执行这个applet。 Applets有安全限制 Web浏览器为applet创建图形环境,GUI应用程序被放在一个框架中。,8,关于applet的安全限制,不允许applet对计算机的文件系统进行读取或写入,计算机的文件系统查看applet。 不允许applet运行浏览器所在的计算机上的任何程序。 除了在服务器上存储applet之外,不允许applet同用户
4、的计算机和其它任何计算机连接到另一台计算机。,9,应用程序和applet之间的转换,应用程序和applet之间的转换非常简单容易。 可以将一个applet转换成一个应用程序。 只要不违反applet上的安全限制,applet都能转换为应用程序。,10,让applet像应用程序一样运行,import javax.swing.*; public class DisplayLabel extends JApplet public DisplayLabel() add(new JLabel(“Great!“, JLabel.CENTER);public static void main(String
5、args) / Create a frameJFrame frame = new JFrame(“Applet is in the frame“);/ Create an instance of the appletDisplayLabel applet = new DisplayLabel();/ Add the applet to the frameframe.add(applet);/ Display the frameframe.setSize(300, 100);frame.setLocationRelativeTo(null); / Center the frame frame.s
6、etDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true); ,11,Applet类,当applet被加载时,Web浏览器调用applet的无参构造方法创建applet的一个实例。浏览器使用init、 start、stop和destroy方法来控制这个applet。默认情况下,这些方法什么都不做。要执行特定功能,它们需要在用户的applet中进行修改,这样浏览器可以正确地调用您的代码。,12,浏览器调用applet方法,13,init()方法,第一次载入applet之后就会调用init方法。如果重新载入applet就
7、会再次被调用。 Applet类的子类如果需要完成一些初始化的工作,则必须覆盖这个方法。通常在这个方法中实现的功能包括创建新的线程,加载图像,设置用户界面组件以及从HTML页面中的标签中获取字符串参数值。,14,start()方法,执行init()方法之后就会调用start()方法;当applet闲置一段时间后,再次变得活跃也会被调用(例如:当用户从其它Web页面返回到包含这个applet的Web页面时)。每当访问包含这个applet的Web页面时有什么功能要实现时,Applet类的子类必须覆盖这个方法。例如:一个applet动画,可以使用start方法来恢复动画。,15,stop()方法,st
8、op方法与start方法恰好相反,start方法是在用户返回包含applet的网页时调用的,而stop方法是在用户离开这个网页时调用的。 如果每次离开包含这个applet的网页不再可见时有什么操作需要执行的话,applet类的子类必须覆盖这个方法。每当用户离开这个网页时,这个applet已经开启但未执行完成的线程将继续执行,可以通过覆盖stop方法来阻塞这个正在执行的线程,这样的话,这个applet就不会在自己不是活动时占用系统资源。,16,destroy()方法,当浏览器正常退出时就会调用destroy方法,以通知applet不再需要它并且应该释放它所占有的资源。 如果在销毁applet之前
9、有什么操作需要完成,那这个Applet的子类必须覆盖这个方法。一般情况下,不需要覆盖这个方法,除非你希望释放如applet创建的线程所占有的特定资源。,17,编写applet,总是继承自JApplet类,JApplet类Swing组件的Applet类的一个子类。 如果需要的话,覆盖init()、start()、stop()和destroy()。默认情况下,这些方法是空的。 如果需要的话,添加自己的方法和数据。 Applets总是嵌入在HTML页面中。,18,给applet传递参数,alt=“You must have a Java-enabled browser to view the app
10、let“ ,19,举例:给Java applet传递参数,目标:在一个特定的位置显示消息。这个消息和它的坐标(x,y)是从HTML源文件中获取的。,Run Applet Viewer,DisplayMessage,20,举例:让程序像applet和 应用程序一样运行,目标:修改MessageApplet使它既能够像applet一样运行,也能像应用程序一样运行。,Run as Application,Run as Applet,DisplayMessageApp,21,实例学习:井字游戏,22,实例学习:井字游戏(续),Run as Applet,TicTacToe,Run as Applica
11、tion,23,目标:写了一个applet,显示一个小球在面板上弹跳。使用两个按钮暂停和重新开始小球的运动,使用一个滚动条控制小球弹跳的速度。,实例学习:弹跳的小球,24,实例学习:弹跳的小球(续),Ball,BallControl,BounceBallApp,Run,25,练习扩展为多个小球,26,applet定位资源,由于安全限制,applet不能访问本地文件。那么,applet怎样加载图像和音频这样的资源文件呢?,27,举例:ImageIcon imageIcon = new ImageIcon(“c:bookimageus.gif“); jlbl.setIcon(imageIcon);
12、该方法会带来一个问题。文件的位置是固定的,因为它使用的是Windows平台的绝对文件路径。结果就造成它不能在其它平台上运行而且也不能作为applet运行。,使用绝对文件名创建ImageIcon,28,假设image/us.gif在类目录下,可以使用如下所示的相对路径来规避这个问题:ImageIcon imageIcon = new ImageIcon(“image/us.gif“); jlbl.setIcon(imageIcon);这样,Java应用程序就能在所有平台上正常工作,但是,这种方法对Java applet不起作用,因为applet不能加载本地文件。为了让它在应用程序和applet中
13、都能工作,需要使用URL类定位这个文件。,使用相对文件路径创建ImageIcon,29,使用URL类定位资源,能够使用.URL类来确定互联网上的文件(图像、音频和文本等)。笼统地说,URL(Uniform Resource Locator,统一资源定位符)是一个指向本地机器或远程主机上某个“资源”的指示器。这里的资源可以只是一个文件或一个目录。,30,从类引用创建一个URL,如果资源文件放在类目录下,那么该文件的URL也可以以独立于文件位置的方式从一个类来访问。,31,显示图像,编写一个程序在面板上显示类目录中来自/image/us.gif的图像。,DisplayImageWithURL,Ru
14、n,32,为一个音频文件创建AudioClip,要在applet中播放音频文件,应该先为这个声音文件创建一个音频剪辑对象。一旦创建了音频剪辑,不需要重新加载文件就能重复播放声音。为了创建一个音频剪辑,使用java.applet.Applet类中的静态方法newAudioClip():AudioClip audioClip = Applet.newAudioClip(url);音频原本只能在Java applet中播放。因为这个原因,AudioClip接口位于java.applet包中。例如:下面的语句为和你运行的类相同的目录下的声音文件beep.au创建一个音频剪辑AudioClip对象:Cl
15、ass class = this.getClass(); URL url = class.getResource(“beep.au“); AudioClip audioClip = Applet.newAudioClip(url);,33,播放音频,使用java.applet.AudioClip中的play()、loop()和stop()方法操控音频剪辑中的声音。,DisplayImagePlayAudio,Run,34,多媒体动画,ImageAudioAnimation,Run as an Application,35,打包和部署Java工程,什么是JAR? 可以使用Java归档文件(Jav
16、a archive file,JAR)来将所有工程文件压缩成一个文件以便部署。Java归档文件格式(JAR)是基于流行的ZIP文件格式。一个文件可以作为应用程序被部署在最终用户的机器。它也可以以一个单一的HTTP形式下载到浏览器,而不是为每一个文件打开一个新连接。这样极大简化了应用程序的部署并提高了一个applet加载到网页的速度和它开始运行的速度。,配套网站,36,创建JAR,你可以使用JDK的jar命令来创建一个归档文件。下面的命令为TicTacToe.class和TicTacToe$Cell.class类创建了一个名为TicTacToe.jar的归档文件。jar -cf TicTacTo
17、e.jar TicTacToe.class TicTacToe$Cell.class-c选项是为了创建一个新的归档文件,而-f选项是为了指定归档文件名称。,配套网站,37,查看一个JAR文件的内容,可以使用WinZip软件查看一个.jar文件的内容。,配套网站,38,清单文件,使用路径名元 inf 来创建一个清单文件。清单文件是一个包含了打包在一个JAR文件中的文件信息的特殊文件。例如:TicTacToe.jar中的清单文件包含以下信息:Manifest-Version: 1.0Name: TicTacToe.class Java-Bean: TrueName: TioTacToe$Cell.
18、class Java-Bean: True为了使JAR文件完成多种目的,可以修改清单文件中的信息。例如:可以通过使用.jar文件来添加信息指定一个主类运行一个应用程序。,配套网站,39,独立运行归档工程,清单文件必须有一个包含主类的条目。例如:为了运行TicTacToe,必须在清单文件中插入下面两条语句:Main-Class: TicTacToe Sealed: true在包含TicTacToe.jar的目录使用java命令运行运行.jar文件: java -jar TicTacToe.jar提示:你可以编写一个安装程序在最终用户的计算机上建立必要的目录和子目录。也可以通过创建一个图标,最终用户可以双击点击来启动安装程序。关于创建Windows桌面图标的详细信息,请参阅 ARCHIVE属性指定包含applet的归档文件。例如:运行TicTacToe的HTML文件可以如下修改: ,配套网站,