Blog信息 |
blog名称:小鸟吹烟 日志总数:157 评论数量:424 留言数量:-1 访问次数:1252810 建立时间:2006年10月23日 |

| |
[JAVA桌面开发]Applet类 文章收藏, 网上资源
tone 发表于 2007/3/14 15:36:21 |
Applet类 Applet类是所有Applet应用的基类,所有的Java小应用程序都必须继承该类。如下所示。
import java. applet.*;public class OurApplet extends Applet{............} Applet类的构造函数只有一种,即:public Applet() Applet实现了很多基本的方法,下面列出了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指定的地址和文件名获取声音。public String getAppletInfo();// 返回Applet应用有关的作者、版本和版权方面的信息;public String[][] getParameterInfo();// 返回描述Applet参数的字符串数组,该数组通常包含三个字符串: 参数名、该参数所需值的类型和该参数的说明。public void play(URL url);// 加载并播放一个url指定的音频剪辑。public void destroy();//撤消Applet及其所占用的资源。若该Applet是活动的,则先终止该Applet的运行。 (1) Applet运行状态控制基本方法 Applet类中的四种基本方法用来控制其运行状态:init()、start()、stop()、destroy() init()方法 这个方法主要是为Applet的正常运行做一些初始化工作。当一个Applet被系统调用时,系统首先调用的就是该方法。通常可以在该方法中完成从网页向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()方法。 (2) 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<LMG>语句一样,ALIGN标志指定的值可以是TOP、MIDDLE或BOTTOM。 * VSPACE与HSPACE 标志 VSPACE和HSPACE标志指定浏览器显示在Applet窗口周围的水平和竖直空白条的尺寸,单位为像素。如下例使用该标志在Applet窗口之上和之下各留出50像素的空白,在其左和其右各留出25像素的空白: * NAME 标志 NAME标志把指定的名字赋予Applet的当前实例。当浏览器同时运行两个或多个Applet时,各Applet可通过名字相互引用或交换信息。如果忽略NAME标志,Applet的名字将对应于其类名。 * PARAM 标志 通用性是程序设计所追求的目标之一。使用户或者程序员能很方便地使用同一个Applet完成不同的任务是通用性的具体表现。从HTML文件获取信息是提高Applet通用性的一条有效途径。 假设编制了一个把某公司的名字在屏幕上卷动的Applet。为了使该Applet更加通用,则可以使该Applet从HTML文件获取需要卷动的文本信息。这样,若想显示另一个公司的名字,用不着修改Java Applet本身,只需修改HTML文件即可。 PARAM 标志可用来在HTML文件里指定参数,格式如下所示:PARAM Name="name" Value="Liter" Java Applet可调用getParameter方法获取HTML文件里设置的参数值。 |
|
回复:Applet类 文章收藏, 网上资源
tone发表评论于2007/3/14 15:49:59 |
声音和图像的协调(Appletl.java)//源程序清单import java.awt.*;import java.applet.*;import java.util.*;public class Appletl extends Applet implements Runnable{ AudioClip audioClip; Thread ShapeThread=null; Random RandomNumber=new Random( ); Color ImageColor; public void init( ) { audioClip=getAudioClip(getCodeBase( ), "Sample.AU");// 创建一个AudioClip对象 } public void start( ) { if (ShapeThread= =null) { ShapeThread=new Thread(this); ShapeThread.start( ); } } public void run() { while (true) { switch (RandomNumber.nextlnt(5)) { //把随机数转换为0~4之间的值 case 0: ImageColor=Color.black; break; case 1: ImageColor=Color.blue; break; case 2: ImageColor=Color.cyan; break; case3: ImageColor=Color.magenta; break; case4: ImageColor=Color.orange; break; default: ImageColor=Color.red; } try { ShapeThread.sleep(300); //线程睡眠 } catch(InterruptedException e) { //忽略异常 repaint(); } } public void paint(Graphics g) { g.setColor(ImageColor); audioClip.play(); //播放声音 switch(RandomNumber.nextlnt(2)) //获取随机数与2整除的余数 { case0:g.fillRect(25,25,200,200); //添充一个矩形 break; default:g.fillOval(25,25,200,200); //添充一个椭圆 break; } }} 该Applet的声音处理非常简单。它首先创建一个AudioClip对象并用getAudioClip把声音文件赋予该对象,然后用AudioClip类的play方法播放声音。该Applet使用Random对象产生随机数。它首先根据随机数确定颜色;然后在paint内根据随机数确定画圆还是画方。Random类的nexsInt函数返回一个随机整数(int型)。该Applet把随机数转换为一个0~4之间的值(在run函数内)和一个0~1之间的值(在paint函数内)。需把如下的HTML语句放入Appletl.HTML文件,为运行该Appletl做准备。<HTML><TITLE>Applet</TITLE><APPLET CODE="Appletl.class" WIDTH=300 HEIGHT=300></APPLET></HTML> |
|
回复:Applet类 文章收藏, 网上资源
tone发表评论于2007/3/14 15:47:41 |
* 动画技巧 在编写动画过程时,遇到最常见的问题是屏幕会出现闪烁现象。闪烁有两个原因:一是绘制每一帧花费的时间太长(因为重绘时要求的计算量大);二是在每次调用Pain()前,Java 会用背景颜色重画整个画面,当在进行下一帧的计算时,用户看到的是背景。 有两种方法可以明显地减弱闪烁:重载 update()或使用双缓冲。 (1) 重载 update() 当AWT接收到一个applet的重绘请求时,它就调用applet的 update(),默认地,update() 清除applet的背景,然后调用 paint()。重载 update(),将以前在paint()中的绘图代码包含在update()中,从而避免每次重绘时将整个区域清除。下面是 update()方法的原始程序代码:public void update(Graphics g){ //首先用背景色来绘制整个画面 g.setColor(getBackGround()); g.fillRect(0,0,width,height); //接着设置前景色为绘制图像的颜色,然后调用paint()方法 g.setColor(getForeGround()); paint(g);} 所以要消除画面闪烁就一定要改写 update() 方法,使该方法不会清除整个画面,只是消除必要的部分。
(2) 使用双缓冲技术 另一种减小帧之间闪烁的方法是使用双缓冲,它在许多动画Applet中被使用。其主要原理是创建一个后台图像,将需要绘制的一帧画入图像,然后调用DrawImage()将整个图像一次画到屏幕上去;好处是大部分绘制是离屏的,将离屏图像一次绘至屏幕上比直接在屏幕上绘制要有效得多,大大提高做图的性能。 双缓冲可以使动画平滑,但有一个缺点,要分配一张后台图像,如果图像相当大,这将需要很大一块内存;当你使用双缓冲技术时,应重载 update()。 下面举一个时钟的例子来说明如何处理动画//AnimatorDemo.javaimport java.util.*;import java.awt.*;import java.applet.*;import java.text.*;public class AnimatorDemo extends Applet implements Runnable { Thread timer; // 用于显示时钟的线程 int lastxs, lastys, lastxm, lastym, lastxh, lastyh; SimpleDateFormat formatter; //格式化时间显示 String lastdate; // 保存当前时间的字符串 Font clockFaceFont; //设置显示时钟里面的数字的字体 Date currentDate; // 显示当前时间 Color handColor; // 用于显示时针、分针和表盘的颜色 Color numberColor; // 用于显示秒针和数字的颜色 public void init() { int x,y; lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0; formatter = new SimpleDateFormat ("yyyy EEE MMM dd hh:mm:ss "); currentDate = new Date(); lastdate = formatter.format(currentDate); clockFaceFont = new Font("Serif", Font.PLAIN, 14); handColor = Color.blue; numberColor = Color.darkGray; try { setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),16))); } catch (Exception E) { } try { handColor = new Color(Integer.parseInt(getParameter("fgcolor1"),16)); } catch (Exception E) { } try { numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),16)); } catch (Exception E) { } resize(300,300); // 设置时钟窗口大小 } // 计算四分之一的圆弧 public void plotpoints(int x0, int y0, int x, int y, Graphics g) { g.drawLine(x0+x,y0+y,x0+x,y0+y); g.drawLine(x0+y,y0+x,x0+y,y0+x); g.drawLine(x0+y,y0-x,x0+y,y0-x); g.drawLine(x0+x,y0-y,x0+x,y0-y); g.drawLine(x0-x,y0-y,x0-x,y0-y); g.drawLine(x0-y,y0-x,x0-y,y0-x); g.drawLine(x0-y,y0+x,x0-y,y0+x); g.drawLine(x0-x,y0+y,x0-x,y0+y); } // 用Bresenham算法来画圆,其中(x0,y0)是圆的中心,r为圆半径 public void circle(int x0, int y0, int r, Graphics g) { int x,y; float d; x=0; y=r; d=5/4-r; plotpoints(x0,y0,x,y,g); while (y>x) { if (d<0) { d=d+2*x+3; x++; } else { d=d+2*(x-y)+5; x++; y--; } plotpoints(x0,y0,x,y,g); } } public void paint(Graphics g) { int xh, yh, xm, ym, xs, ys, s = 0, m = 10, h = 10, xcenter, ycenter; String today; currentDate = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("s",Locale.getDefault()); try { s = Integer.parseInt(formatter.format(currentDate)); } catch (NumberFormatException n) { s = 0; } formatter.applyPattern("m"); try { m = Integer.parseInt(formatter.format(currentDate)); } catch (NumberFormatException n) { m = 10; } formatter.applyPattern("h"); try { h = Integer.parseInt(formatter.format(currentDate)); } catch (NumberFormatException n) { h = 10; } formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy"); today = formatter.format(currentDate); //设置时钟的表盘的中心点为(80,55) xcenter=80; ycenter=55; // a= s* pi/2 - pi/2 (to switch 0,0 from 3:00 to 12:00) // x = r(cos a) + xcenter, y = r(sin a) + ycenter xs = (int)(Math.cos(s * 3.14f/30 - 3.14f/2) * 45 + xcenter); ys = (int)(Math.sin(s * 3.14f/30 - 3.14f/2) * 45 + ycenter); xm = (int)(Math.cos(m * 3.14f/30 - 3.14f/2) * 40 + xcenter); ym = (int)(Math.sin(m * 3.14f/30 - 3.14f/2) * 40 + ycenter); xh = (int)(Math.cos((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + xcenter); yh = (int)(Math.sin((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + ycenter); //画时钟最外面的圆盘其中心在(xcenter,ycenter)半径为50 g.setFont(clockFaceFont); g.setColor(handColor); circle(xcenter,ycenter,50,g); //画时钟表盘里的数字 g.setColor(numberColor); g.drawString("9",xcenter-45,ycenter+3); g.drawString("3",xcenter+40,ycenter+3); g.drawString("12",xcenter-5,ycenter-37); g.drawString("6",xcenter-3,ycenter+45); // 如果必要的话抹去然后重画 g.setColor(getBackground()); if (xs != lastxs || ys != lastys) { g.drawLine(xcenter, ycenter, lastxs, lastys); g.drawString(lastdate, 5, 125); } if (xm != lastxm || ym != lastym) { g.drawLine(xcenter, ycenter-1, lastxm, lastym); g.drawLine(xcenter-1, ycenter, lastxm, lastym); } if (xh != lastxh || yh != lastyh) { g.drawLine(xcenter, ycenter-1, lastxh, lastyh); g.drawLine(xcenter-1, ycenter, lastxh, lastyh); } g.setColor(numberColor); g.drawString("", 5, 125); g.drawString(today, 5, 125); g.drawLine(xcenter, ycenter, xs, ys); g.setColor(handColor); g.drawLine(xcenter, ycenter-1, xm, ym); g.drawLine(xcenter-1, ycenter, xm, ym); g.drawLine(xcenter, ycenter-1, xh, yh); g.drawLine(xcenter-1, ycenter, xh, yh); lastxs=xs; lastys=ys; lastxm=xm; lastym=ym; lastxh=xh; lastyh=yh; lastdate = today; currentDate=null; } //applet的启动方法 public void start() { timer = new Thread(this); timer.start(); } // applet的停止方法 public void stop() { timer = null; } //线程的run方法 public void run() { Thread me = Thread.currentThread(); while (timer == me) { try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { } repaint(); } } //注意:这里重写了update()方法,只是调用了paint()方法来消除闪烁现象 public void update(Graphics g) { paint(g); } } 下面是运行该Applet 需要的AnimatorDemo.html 的内容<HTML><HEAD> <TITLE>一个时钟的例子</TITLE></HEAD><BODY> <hr> <applet codebase="." ALIGN=MIDDLE code="AnimatorDemo.class" width=200 height=150> </applet></BODY></HTML> |
|
回复:Applet类 文章收藏, 网上资源
tone发表评论于2007/3/14 15:46:09 |
(1) 播放声音文件 图像格式各种各样,如BMP、GIF和JPEG等。声音文件也一样,WAV和AU是最常用的两种声音文件。目前Java仅支持AU文件,但Windows环境下常用的却是WAV文件,所以最好能有一个可把WAV文件转换为AU文件的工具。 * 播放声音的AudioClip类 AudioClip类用来在Java Applet内播放声音,该类在java.Applet包中有定义。 下面演示了如何利用AudioClip类播放声音。 装入一个名为Sample.Au的声音文件并播放(SoundDemo.java)//源程序清单import java.awt.*;import java.applet.* public class SoundDemo extends Applet{ public void paint(Graphics g) { AudioClip audioClip=getAudioClip(getCodeBase(),”Sample.AU”); //创建AudioClip对象并用//getAudioClip方法将其初始化。 g.drawstring("Sound Demo! ",5,15); audioClip.loop();//使用AudioClip类的loop方法循环播放 }} 需把如下的HTML语句放入SoundDemo.HTML文件,为运行该Applet做准备。<HTML><TITLE>SoundDemo Applet</TITLE><APPLET CODE="SoundDemo.class" WIDTH=300 HEIGHT=200></APPLET></HTML> 编译并运行该Applet,屏幕上将显示出一个Applet窗口并伴以音乐。关闭Applet时音乐终止。 |
|
» 1 »
|