java程序设计--孙鑫java无难事Lesson11《Applet》

来源:互联网 发布:全国十大淘宝村集群 编辑:程序博客网 时间:2024/05/29 03:33
java程序设计--孙鑫java无难事Lesson11《Applet》
本节要点:
1.Applet编程,详细讲解Applet的生命周期,子体的设置
2.Applet从网页中获取信息,applet和浏览器的通信
3.Applet更新显示的原理,用Applet来制作动画程序,以及动画程序的优化。

详细内容:
1.Applet简介
(1)Applet是什么
Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类 。
Applet不需要main()方法,由Web浏览器中内嵌的Java虚拟机调用执行。
(2)Applet的安全限制
因为applet是从远端服务器上下载并且在本地执行,所以安全性就显得格外重要。
通过限制applet在沙箱(applet的运行环境)中运行,保证了对本地系统而言applet是安全的。
applet在沙箱中运行时:
a.不能运行任何本地可执行程序;
b.除了存放下载的applet的服务器外,applet不能和其它主机进行通信。
c.不能对本地文件系统进行读写。
(3)Applet的生命周期
init():当浏览器加载applet,进行初始化的时候调用该方法。
start():在init()方法之后调用。当用户从其它页面转到包含applet的页面时,该方法也被调用。
stop():在用户离开包含applet的页面时被调用。
destroy():当applet不再被使用,或浏览器退出的时候,该方法被调用。
2.Applet和浏览器的交互
(1)Applet获取网页信息
正如应用程序可以通过命令行参数来获取信息一样,通过使用param标记,applet可以从网页中获取信息。
(2)Applet和浏览器的通信
在浏览器中显示信息              调用AppletContext接口中的showStatus()方法
请求浏览器显示指定的网页   调用AppletContext接口中的showDocument()方法。
简单的Applet测试程序代码如下:
[java] view plaincopyprint?
  1. package imageTest;  
  2. import java.applet.Applet;  
  3. import java.awt.Graphics;  
  4. import java.awt.Color;  
  5. import java.awt.Font;  
  6. import java.awt.Button;  
  7. import java.awt.event.MouseAdapter;  
  8. import java.awt.event.MouseEvent;  
  9. import java.awt.event.ActionListener;  
  10. import java.awt.event.ActionEvent;  
  11. import java.net.URL;  
  12. public class TestApplet extends Applet  
  13. {  
  14.     String strFont;  
  15.     int xOrigin,yOrigin;  
  16.     public void init()  
  17.     {  
  18.         Button btn=new Button("链接");  
  19.         //写入状态栏   
  20.         getAppletContext().showStatus("java Applet test,a simple demo");  
  21.         add(btn);  
  22.         //链接新文件   
  23.         btn.addActionListener(new ActionListener()  
  24.         {  
  25.             public void actionPerformed(ActionEvent e)  
  26.             {  
  27.                 try  
  28.                 {  
  29.                     getAppletContext().showDocument(  
  30.                         new URL(getDocumentBase(),"test.html"),"_blank");  
  31.                 }  
  32.                 catch(Exception ex)  
  33.                 {  
  34.                     ex.printStackTrace();  
  35.                 }  
  36.             }  
  37.         });  
  38.         //获取网页字体信息   
  39.         strFont=getParameter("font");  
  40.         //捕获用户鼠标动作 绘制直线   
  41.         addMouseListener(new MouseAdapter()  
  42.         {  
  43.             public void mousePressed(MouseEvent e)  
  44.             {  
  45.                 xOrigin=e.getX();  
  46.                 yOrigin=e.getY();  
  47.             }  
  48.             public void mouseReleased(MouseEvent e)  
  49.             {  
  50.                 Graphics g=getGraphics();  
  51.                 g.setColor(Color.red);  
  52.                 g.drawLine(xOrigin,yOrigin,e.getX(),e.getY());  
  53.             }  
  54.         });  
  55.     }  
  56.     public void start()  
  57.     {  
  58.         System.out.println("start");  
  59.     }  
  60.     public void stop()  
  61.     {  
  62.         System.out.println("stop");  
  63.     }  
  64.     public void destroy()  
  65.     {  
  66.         System.out.println("destroy");  
  67.     }  
  68.     //绘图操作   
  69.     public void paint(Graphics g)  
  70.     {  
  71.         //Font f=new Font("华文行楷",Font.BOLD,30);//构造字体  
  72.         Font f=new Font(strFont,Font.BOLD,30);  
  73.         g.setFont(f);  
  74.         g.setColor(Color.blue);  
  75.         g.drawString("java Applet Test",0,30);  
  76.     }  
  77. }  
  78. //AppletTest.html     
  79. /* 
  80. <applet code="imageTest.TestApplet.class" width=600 height=400 > 
  81. <param name="font" value="楷体_GB2312"> 
  82. */  
运行效果如下图所示:

3.AWT绘图
(1)paint()方法
Applet本质上是图形方式的,我们应该在图形环境中绘制我们的显示内容。
我们可以通过创建一个paint()方法在Applet的panel上绘图。只要Applet的显示需要刷新,paint()方法就会被浏览器环境调用。例如,当Applet的显示尺寸发生变化的时候,或浏览器窗口被最小化或被要求以图标方式显示时,这种调用就会发生。
我们应该编写自己的paint()方法,以使它在任何时候被调用,都能正常地工作。对它的调用是异步产生的,且由Applet的运行环境而不是程序来驱动 。
paint()方法带有一个参数,它是java.awt.Graphics类的一个实例。这个参数总是建立该Applet的panel的图形上下文,我们可以用这个图形上下文在Applet中绘图或写入文本。
(2)AWT绘图更新及方法
更新显示由一种被称为AWT线程的独立的线程来完成。这个线程可用来处理与显示更新相关的两种情况。
第一种情况是显露(exposure),它在首次显示时,或在部分显示已被破坏而必须刷新时出现。显示的破坏可能发生在任何时刻,因此,我们的程序必须能在任意时刻更新显示。
第二种情况是在程序重画带有新内容的画面时。这种重画可能会要求首先擦除原来的图像。
AWT更新方法:
paint(Graphics g)方法  当组件第一次显示,或受损的部分需要修复时被调用。除非必要,更新不会完全覆盖整个图形区域,而是严格限制在被破坏的范围内。
repaint()方法      对repaint()的调用可通知系统:你想改变显示,于是系统将调用paint()。
update(Graphics g)方法  repaint()实际上产生了一个调用另一方法update()的AWT线程。update方法通常清除当前的显示并调用paint()。update()方法可以被修改,例如:为了减少闪烁可不清除显示而直接调用paint()。
Applet简单图片显示程序代码如下:

[java] view plaincopyprint?
  1. package imageTest ;  
  2. import java.applet.Applet;  
  3. import java.awt.Graphics;  
  4. import java.awt.Image;  
  5. //简单的图片显示   
  6. public class ShowImage extends Applet  
  7. {  
  8.     private Image[] imgs;  
  9.     private int totalImage=10;  
  10.     private int currentImage=0;  
  11.     public void init()  
  12.     {     
  13.         imgs=new Image[totalImage];//别忘了分配内存  
  14.         //构造图片数组  但此时图片并未加载   
  15.         for(int i=0;i<totalImage;++i)  
  16.             imgs[i]=getImage(getDocumentBase(),"T"+(i+1)+".gif");  
  17.     }  
  18.     public void start()  
  19.     {  
  20.         currentImage=0;  
  21.     }  
  22.     public void paint(Graphics g)  
  23.     {  
  24.         g.drawImage(imgs[currentImage],0,0,this);//显示图片到Applet面板  
  25.         currentImage=(++currentImage)%totalImage;  
  26.         try   
  27.         {  
  28.             Thread.sleep(500);//暂停  
  29.         }   
  30.         catch (InterruptedException e)  
  31.         {  
  32.             // TODO Auto-generated catch block  
  33.             e.printStackTrace();  
  34.         }  
  35.         repaint();//再次更新后显示下一张图片  
  36.     }  
  37.     /* 
  38.     //ShowImage不可以采用以下方式 
  39.     public void update(Graphics g) 
  40.     { 
  41.         paint(g); 
  42.     } 
  43.     */  
  44.     private static final long serialVersionUID = 1L;  
  45. }  

Applet双缓冲图片显示程序代码如下:

[java] view plaincopyprint?
  1. package imageTest;  
  2.   
  3. import java.applet.Applet;  
  4. import java.awt.Color;  
  5. import java.awt.Graphics;  
  6. import java.awt.Image;  
  7. import java.awt.MediaTracker;  
  8. //双缓冲显示图片 减轻图片显示时闪烁   
  9. public class DoubleBufferImage extends Applet  
  10. {  
  11.     private Image[] imgs;  
  12.     private int totalImage=10;  
  13.     private int currentImage=0;  
  14.     private Image   imgBuf;  
  15.     private Graphics gbuf;  
  16.     private MediaTracker mt;//跟踪媒体状态  
  17.     public void init()  
  18.     {     
  19.         mt=new MediaTracker(this);  
  20.         //屏幕外作图   
  21.         imgBuf=createImage(600,400);  
  22.         gbuf=imgBuf.getGraphics();  
  23.         gbuf.setColor(Color.white);  
  24.         gbuf.fillRect(0,0,600,400);  
  25.           
  26.         imgs=new Image[totalImage];//别忘了分配内存  
  27.         for(int i=0;i<totalImage;++i)  
  28.             {  
  29.                 imgs[i]=getImage(getDocumentBase(),"T"+(i+1)+".gif");  
  30.                 mt.addImage(imgs[i], i);  
  31.             }  
  32.         try   
  33.         {  
  34.             mt.waitForID(0);//等待图片载入  
  35.         }   
  36.         catch (InterruptedException e)   
  37.         {  
  38.             // TODO Auto-generated catch block  
  39.             e.printStackTrace();  
  40.         }  
  41.     }  
  42.     public void start()  
  43.     {  
  44.         currentImage=0;  
  45.         gbuf.drawImage(imgs[currentImage],0,0,this);  
  46.         currentImage=1;  
  47.     }  
  48.     public void paint(Graphics g)  
  49.     {     
  50.         //当前上下文作图   
  51.         g.drawImage(imgBuf,0,0,this);  
  52.         //屏幕外绘图   
  53.         gbuf.fillRect(0,0,600,400);  
  54.         //检查图片载入,若为载入则等待载入   
  55.         if(mt.checkID(currentImage, true))  
  56.         {  
  57.             gbuf.drawImage(imgs[currentImage],0,0,this);  
  58.             currentImage=(++currentImage)%totalImage;  
  59.         }  
  60.         try   
  61.         {  
  62.             Thread.sleep(500);//暂停  
  63.         }   
  64.         catch (InterruptedException e)  
  65.         {  
  66.             // TODO Auto-generated catch block  
  67.             e.printStackTrace();  
  68.         }  
  69.         repaint();  
  70.     }  
  71.     //因为绘图已在内存中完成,可以采用此方式   
  72.     public void update(Graphics g)  
  73.     {  
  74.         paint(g);  
  75.     }  
  76.     private static final long serialVersionUID = 1L;  
  77. }  

Applet多线程图片显示程序代码如下:

[java] view plaincopyprint?
  1. package imageTest;  
  2.   
  3. import java.applet.Applet;  
  4. import java.awt.Color;  
  5. import java.awt.Graphics;  
  6. import java.awt.Image;  
  7. import java.awt.MediaTracker;  
  8. //多线程 双缓冲显示图片   
  9. public class MultiThreadImage extends Applet implements Runnable  
  10. {  
  11.     private static final long serialVersionUID = 1L;  
  12.     private boolean bstop=false;  
  13.     private Image[] imgs;  
  14.     private int totalImage=10;  
  15.     private int currentImage=0;  
  16.     private Image   imgBuf;  
  17.     private Graphics gbuf;  
  18.     private MediaTracker mt;  
  19.     public void init()  
  20.     {     
  21.         mt=new MediaTracker(this);//跟踪媒体状态  
  22.         //屏幕外作图   
  23.         imgBuf=createImage(600,400);  
  24.         gbuf=imgBuf.getGraphics();  
  25.         gbuf.setColor(Color.white);  
  26.         gbuf.fillRect(0,0,600,400);  
  27.         imgs=new Image[totalImage];//别忘了分配内存  
  28.         for(int i=0;i<totalImage;++i)  
  29.             {  
  30.                 imgs[i]=getImage(getDocumentBase(),"T"+(i+1)+".gif");  
  31.                 mt.addImage(imgs[i], i);  
  32.             }  
  33.         try   
  34.         {  
  35.             mt.waitForID(0);  
  36.         }   
  37.         catch (InterruptedException e)   
  38.         {  
  39.             // TODO Auto-generated catch block  
  40.             e.printStackTrace();  
  41.         }  
  42.     }  
  43.     public void start()  
  44.     {  
  45.         currentImage=0;  
  46.         gbuf.drawImage(imgs[currentImage],0,0,this);  
  47.         new Thread(this).start();//启动线程  
  48.         currentImage=1;  
  49.     }  
  50.     public void paint(Graphics g)  
  51.     {     
  52.         //当前上下文作图   
  53.         g.drawImage(imgBuf,0,0,this);  
  54.     }  
  55.     //因为绘图已在内存中完成,可以采用此方式   
  56.     public void update(Graphics g)  
  57.     {  
  58.         paint(g);  
  59.     }  
  60.     //实现接口方法   
  61.     public void run()  
  62.     {     
  63.         //注意线程退出的处理技巧   
  64.         while(!bstop)  
  65.         {  
  66.             //屏幕外绘图   
  67.             gbuf.fillRect(0,0,600,400);  
  68.             if(mt.checkID(currentImage, true))  
  69.             {  
  70.                 gbuf.drawImage(imgs[currentImage],0,0,this);  
  71.                 currentImage=(++currentImage)%totalImage;  
  72.             }  
  73.             try   
  74.             {  
  75.                 Thread.sleep(500);//暂停  
  76.             }   
  77.             catch (InterruptedException e)  
  78.             {  
  79.                 // TODO Auto-generated catch block  
  80.                 e.printStackTrace();  
  81.             }  
  82.             repaint();  
  83.         }  
  84.     }  
  85.     //停止线程   
  86.     public void stop()  
  87.     {  
  88.         bstop=true;  
  89.     }  
  90.   
  91. }  

运行效果如下图所示(因为图片放在这里,本身看不出差别,因此仅放上一张图片):

ShowImage中错误调用update方法,造成图片重叠,如下图所示:


4.applet的HTML标记和属性
用于定位的applet属性:
(1)width和height:必要的属性,以象素为单位,设定applet的宽度和高度。
(2)align:可选的属性,指定applet对齐的方式。
left:       把applet放在网页左边,后面的文本会移至applet的右边。
right:      把applet放在网页右边,后面的文本会移至applet的左边。
bottom:     把applet的底部与当前行文本底部对齐。
top:        把applet的顶部与当前行顶部对齐。
texttop:    把applet的顶部与当前行文本顶部对齐。
middle:     把applet的中部与当前行基线对齐。
absmiddle:  把applet的中部与当前行中部对齐。
baseline:   把applet的底部与当前行基线对齐。
absbottom:  把applet的底部与当前行底部对齐。
(3)vspace和hspace:可选的属性,指定在applet上/下的象素数目(vspace)和applet两边的象素数目(hspace)。
用于编码的applet属性:
(1)code:指定applet类文件的名字。该名字要么是相对于codebase,那么是相对于当前页面。
(2)codebase:可选的属性,告诉浏览器到哪个目录下去寻找类文件。
(3)archive:可选的属性,列出Java存档文件、包含类文件的文件或者applet需要的其它资源。
(4)object:用来指定applet类文件的另外一个方法。
(5)name:可选的属性,页面脚本编写人员希望赋予applet名字属性,这样,在编写脚本的时候,就可以用为该属性指定的名字来代表这个applet。
补充:
(1)Applet程序和资源文件打包方式如下方式:

F:\java\JavaLesson\Lesson11>jar -cvf imageTest.jar  imageTest  T*.gif  *.html

(2)Audio测试程序代码如下:

[java] view plaincopyprint?
  1. package AudioTest;  
  2.   
  3. import java.applet.Applet;  
  4. import java.applet.AudioClip;  
  5.   
  6. public class PlaySound extends Applet   
  7. {     
  8.     private static final long serialVersionUID = 1L;  
  9.     private AudioClip ac;  
  10.     public void init()  
  11.     {  
  12.         //play(getDocumentBase(), "1.au");   
  13.         //连续播放   
  14.         ac=getAudioClip(getDocumentBase(), "1.au");  
  15.         ac.loop();  
  16.     }  
  17.     public void stop()  
  18.     {   
  19.         ac.stop();  
  20.     }  
  21. }  
原创粉丝点击