510 likes | 807 Views
第 10 章 Applet 编程. (时间: 2 次课, 4 学时). 第 10 章 Applet 编程. 教学提示: Java Applet 是一类特殊的 Java 程序,通常称为 Java 小应用程序,它嵌入在 HTML 语言中,随网页发布到 Internet 上。它与 Java Application 的区别主要在于其执行方式的不同, Java Application 是从 main() 方法开始运行的,而 Java Applet 则相对复杂 — 点,它可以在浏览器环境中运行。
E N D
第10章 Applet编程 (时间:2次课,4学时)
第10章 Applet编程 • 教学提示:Java Applet是一类特殊的Java程序,通常称为Java小应用程序,它嵌入在HTML语言中,随网页发布到Internet上。它与Java Application的区别主要在于其执行方式的不同,Java Application是从main()方法开始运行的,而Java Applet则相对复杂—点,它可以在浏览器环境中运行。 • 本章主要介绍: Applet的基本知识、 Appletviewer、HTML中的Applet标记和应用JAR包
第10章 Applet编程 • 10.1 Applet的基本知识 • 10.2 Appletviewer • 10.3 HTML中的Applet标记 • 10.4 应用JAR包 • 10.5 Applet编程实例 • 10.6 课后练习
10.1 Applet的基本知识 • 10.1.1 Applet的工作原理 • 10.1.2 Applet类的主要方法
10.1 Applet的基本知识 • 在揭开Applet神秘面纱之前,首先需要了解Applet的工作机制和使用,下面将详细介绍。
10.1.1 Applet的工作原理 • Applet是一种Java的小程序,它通过使用该Applet的HTML文件,由支持Java的网页浏览器下载运行。也可以通过Java开发工具的Appletviewer来运行。Applet 程序离不开使用它的HTML文件。这个HTML文件中关于Applet的信息至少应包含以下3点: • 字节码文件名(编译后的Java文件,以.class为后缀)。 • 字节码文件的地址。 • 在网页上显示Applet的方式。 • 一个HTML文件增加Applet有关的内容只是使网页更加富有生气,如添加声音、动画等这些吸引人的特征,它并不会改变HTML文件中与Applet无关的元素。
10.1.1 Applet的工作原理 • 下面举一个最简单的HelloWorld 例子来说明Applet程序的开发过程。 • (1) 编辑Applet的Java源文件 • 创建文件夹C:\ghq,在该文件夹下建立HelloWorld.java。文件的源代码如下: • import java.awt.*; • import java.applet.*; • public class HelloWorld extends Applet • //继承Appelet类,这是Appelet Java程序的特点 • { • public void paint(Graphics g ) • { • g.drawString("Hello World!",5,35); • } • } • 保存上述程序在C:\ghq\HelloWorld.java文件里。
10.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>
10.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或用浏览器运行)。
10.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指定的地址和文件名获取声音。
10.1.2 Applet类的主要方法 • public String getAppletInfo():返回Applet应用有关的作者、版本和版权方面的信息。 • public String[][] getParameterInfo():返回描述Applet参数的字符串数组,该数组通常包含3个字符串:参数名、该参数所需值的类型和该参数的说明。 • public void play(URL url):加载并播放一个url指定的音频剪辑。 • public void destroy():撤消Applet及其所占用的资源。若该Applet是活动的,则先终止该Applet的运行。 • 2. Applet运行状态控制基本方法 • Applet类中的4种基本方法用来控制其运行状态,它们是init()、start()、stop()、destroy()。 • init()方法:这个方法主要是为Applet的正常运行做一些初始化工作。当一个Applet被系统调用时,系统首先调用的就是该方法。通常可以在该方法中完成从网页向Applet传递参数,添加用户界面的基本组件等操作。
10.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()方法)。
10.2 Appletviewer • 10.2.1 什么是Appletviewer • 10.2.2 用Appletviewer 启动Applet • 10.2.3 使用Appletviewer
10.2 Appletviewer • 编写好了Applet程序,还要运行Applet程序,这时就要使用Appletviewer,本节将详细介绍Appletviewer的使用。
10.2.1 什么是Appletviewer • Applet通常运行于一个Web浏览器中,如HotJava TM、Netscape或Navigator,它们有支持Java软件程序运行的能力。为了简化和加速开发过程,JDK应运而生,它附带有一个专为查看Applet而设计但不支持HTML页面查看的工具。这个工具就是Appletviewer。 • Appletviewer是使你不必使用Web浏览器即可运行Applet的一个Java应用程序。它犹如一个“最小化的浏览器”。 • Appletviewer读取命令行中URL所指定的HTML文件。这个文件必须包含装入及执行一个或多个Applet的指令。Appletviewer忽略了所有其他的HTML代码。它不能显示普通的HTML或嵌入在一个文本页中的Applet。
10.2.2 用Appletviewer启动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>
10.2.3 使用Appletviewer • Appletviewer带有一个指向包含<APPLET>标记的HTML文件的URL,这个URL被作为命令行参数。 • Appletviewer [-debug] URLs ... • Appletviewer仅有的合法选项是-debug,它使得Applet在Java调试器jdb中启动。若用带-g选项的方式编译Java代码,则可在调试器中看到源代码。
10.3 HTML中的Applet标记 • 利用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。
10.3 HTML中的Applet标记 • VSPACE与HSPACE标记。VSPACE和HSPACE标记分别指定浏览器显示在Applet窗口周围的水平和竖直空白条的尺寸,单位为像素。如可以使用该标记在Applet窗口之上和之下各留出50像素的空白,在其左和其右各留出25像素的空白。 • NAME标记。NAME标记把指定的名字赋予Applet的当前实例。当浏览器同时运行两个或多个Applet时,各Applet可通过名字相互引用或交换信息。如果忽略NAME标记,Applet的名字将对应于其类名。 • PARAM标记。通用性是程序设计所追求的目标之一。使用户或者程序员能很方便地使用同一个Applet完成不同的任务是通用性的具体表现。从HTML文件获取信息是提高Applet通用性的一条有效途径。PARAM标记较好地实现了Applet的通用性。
10.3 HTML中的Applet标记 • 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以默认参数运行。
10.3 HTML中的Applet标记 • 下面是在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,则将背景设置为HTML中指定的颜色;如果读取的参数的名称是SPEED,则设置速度为HTML中指定的值。
10.4 应用JAR包 • JAR(Java Archive)是一种与平台无关的文档格式,一般叫Java存档,它相当于一种压缩格式,可以把众多的文档合成一个文件。 • 大多数的Applet都由多个类组成,使用浏览器来浏览这样的Applet时,由于一个文件需要一个连接,所以浏览器需要使用多个连接,这样在一个低速的网络上加载一个Applet需要好几分钟。这里值得注意的是,加载Applet需要较长的时间的原因并不是因为类文件太大,关键的原因是建立到服务器的连接需要的时间长。 • 对于Applet来说,JAR文件可以将多个需要的类文件合并为一个单一的文件。这是很有意义的,这样这些类文件可以作为一个整体使用一个HTTP事务下载到浏览器中,从而大大提高浏览速度。
10.4 应用JAR包 • jar命令格式如下: • jar [选项1] … [选项n] 文件名1 文件名2 … • jar命令的选项如下。 • c:创建新的存档,并把文件添加至其中,如果一个文件名是一个目录,它将被递归处理。 • t:列出存档内容的列表。 • x:展开存档中的命名的(或所有的)文件。 • u:更新已存在的存档。 • v:生成详细输出到标准输出上。 • f:指定存档文件名。 • m:包含来自标明文件的标明信息。 • 0:只存储方式,未用ZIP压缩格式。 • M:不产生所有项的清单(manifest)文件。 • i:为指定的jar文件产生索引信息。 • C:改变到指定的目录。
10.4 应用JAR包 • 例如: • 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>
10.5 Applet编程实例 • 10.5.1 编写一个Applet • 10.5.2 获取键盘事件 • 10.5.3 捕获鼠标事件 • 10.5.4 计算器 • 10.5.5 图片百叶窗
10.5 Applet编程实例 • 本节通过5个例子(包括波浪文字、获取键盘事件、获取鼠标事件、计算器以及图片百叶窗)来展示Applet的强大功能。
10.5.1 编写一个Applet • 下面将通过Applet来实现波浪文字,进而展示Applet的魅力。波浪文字具有较强动感,用在网页特效中能达到出奇制胜的效果,流畅的波动加上色彩的变幻会给人耳目一新的感觉,加深对页面的印象。本例实现了波浪文字效果,实例的运行结果如图10-1、图10-2所示,图中的文字以一定的节奏呈波浪状起伏。
10.5.1 编写一个Applet • 图10-1 效果一 图10-2 效果二
10.5.1 编写一个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);
10.5.1 编写一个Applet • 2. 波浪效果的形成 • FontMetric类提供了获取显示文本各种属性的方法,用getMaxAdvance方法可取得一个字符的advance值,即字符的宽度。 • Math类的sin和cos方法分别计算出角度的正弦和余弦值。direct变量表示波动的方向,Hrad 和Vrad参数分别表示波动的水平和垂直方向上的距离。通过这几个参数,计算出波动的角度和x坐标、y坐标。 • Graphics类的drawChars方法可在指定位置绘制一个或多个字符,方法原型如下: • drawChars(char[] data, int offset, int length, int x, int y); • 在指定位置绘制字符,参数依次为:字符数组、待绘制字符在数组中的起始位置、字符长度(即绘制多少个字符)、绘制字符的x坐标、y坐标。
10.5.1 编写一个Applet • 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);
10.5.1 编写一个Applet • 3. 代码 • 下面是该程序的代码: • import java.awt.*; • import java.applet.*; • public class WaveTextApplet extends Applet implements Runnable { • String message; //显示文本 • int direct,phase; //运动方向参数 • Thread thread; //波浪运动线程 • char words[]; //显示文本的字符数组 • Image image; //Image对象 • Graphics graphics; //Graphics对象 • Color colors[]; //显示文本颜色 • private Font font; //显示字体 • private FontMetrics fontMetric; //显示字体的 FontMetrics对象
10.5.1 编写一个Applet • 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)); • //填充颜色数组数据 • } • }
10.5.1 编写一个Applet • 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); • } • }
10.5.2 获取键盘事件 • 在执行Applet小程序时,可以让程序接收键盘事件,这样可以更好地实现人机对话功能。方法是直接在程序中调用addKeyListener(KeyListener obj)方法,并使用无名类的方式实现KeyLisener接口中的方法,此处可以根据用户需求实现其中所需要的方法即可,也可以全部实现。 • 接口KeyListener内所定义的方法如下。 • void keyPressed(KeyEvent e):按下某个键时调用此方法。 • void keyReleased(KeyEvent e):释放某个键时调用此方法。 • void keyTyped(KeyEvent e):键入某个键时调用此方法。 • 下面的程序是通过Applet小程序,向网页中连续加载图片,实现动画效果。并接收键盘的Keypress事件。
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; • } • } );
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; • }
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(); • } • }
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):鼠标按钮在组件上释放时调用。
10.5.4 计算器 • 1. 界面设计 • 整个界面由3个面板组成,第1个面板放置输入信息和运算结果的显示文本域以及一个清除输入的按钮。setLayout方法用于设置容器的布局管理器,这里采用流布局,即FlowLayout,所有放置的组件按大小依次排列。 • panel1.setLayout(new FlowLayout()); • panel1.add(tfAnswer); • panel1.add(bClear); • 第2个面板放置数字按钮、点按钮及等于按钮。在for循环中,依次实例化9个数字按钮,并将按钮用add方法加入到第2面板中。 • setForeground方法可为组件设置前景色,这里将按钮文字设置为红色(Color.red)显示,以将功能按钮与数字按钮区分开来。 • for(int i=9;i>=0;i--){ • b[i]=new Button(Integer.toString(i)); • panel2.add(b[i]); • }
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);
10.5.4 计算器 • 2. 事件处理 • 事件处理通过action方法来完成,方法体如下所示: • public boolean action(Event e, Object o) {} • 可通过Event类的target变量来获取事件来源,如下面的语句,将e.target与等于按钮bEqual相比较,如果相符,则事件来源于等于按钮,这里应调用对应的方法处理运算结果,并显示出来。 • if(e.target == bEqual) { • doOperator(); • }
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(); • }
10.5.4 计算器 • 4. 计算器程序 • 下面是设计计算器的代码(详见书315~317页) • 运行效果如图10-3所示。 图10-3 运行效果
10.5.5 图片百叶窗 • 1. 从图像获取像素数组 • java.awt.image.PixelGrabber是在给定图像中抓取矩形区域中的像素的ImageConsumer接口的一个实现,可通过它来抓取一定的图像区域到像素数组中。 • 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,imageHeight,pix1,0,imageWidth); • try{ • pg1.grabPixels(); • } • catch(InterruptedException ex){}
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,imageHeight,pixA,0,imageWidth));
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,pixA,0, imageWidth)); • repaint(); • }
10.5.5 图片百叶窗 • 4. 图片百叶窗程序 • 下面是该程序的代码(详见书319~322页) • 运行结果如图10-4所示。 • 图10-4 运行效果图
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 的输入输出既可以是字符界面,也可以是图形界面。 ( )
10.6 课后练习 • 4. 简答题 • (1) 什么是Java Application? • (2) 什么是Java Applet? • (3) Applet程序的基本控制方法有哪些? • (4) 在Applet程序中可以获得哪些事件? • 5. 操作题 • (1) 编写一个Java Application程序,接受用户输入一行字符串,并输出该字符串。 • (2) 编写一个Applet程序和相应的页码文件,通过页面文件传递参数,在Applet程序中绘制一个长方形。