明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

JAVA圖文說明教程 第6講 Java的線程與Java Applet(二)

[摘要]6.3 Java Applet   前面的章節(jié)我們闡述了Application的應(yīng)用,這一講我們將介紹java的另一類應(yīng)用java Applet,即java小應(yīng)用程序。   在Java問世的頭幾年里,之所以如此熱門,其根本原因還是在于Java具有"讓Internet動(dòng)起來"的能...
6.3 Java Applet

  前面的章節(jié)我們闡述了Application的應(yīng)用,這一講我們將介紹java的另一類應(yīng)用java Applet,即java小應(yīng)用程序。

  在Java問世的頭幾年里,之所以如此熱門,其根本原因還是在于Java具有"讓Internet動(dòng)起來"的能力。具體地說,就是Java能創(chuàng)建一種特殊類型的程序(通常稱作"小應(yīng)用程序"或者Applet),具備Java能力的Web瀏覽器可從網(wǎng)上下載這種程序,然后運(yùn)行。

  目前,幾乎所有瀏覽器均支持動(dòng)態(tài)HTML(DHTML)和腳本編制(支持XML的瀏覽器也有很多),所以比起Java剛剛問世的時(shí)候,瀏覽器能夠做的事情要多得多。但盡管如此,由于小應(yīng)用程序是用一種全功能的程序設(shè)計(jì)語(yǔ)言編制的,所以同HTML、XML和腳本語(yǔ)言的任何一種可能的組合相比,它仍然具有應(yīng)用前景!

  6.3.1 Applet 介紹(1)

  Applet就是使用Java語(yǔ)言編寫的一段代碼,它可以在瀏覽器環(huán)境中運(yùn)行。它與Application的區(qū)別主要在于其執(zhí)行方式的不同。application 是從其中的main() 方法開始運(yùn)行的,而Applet 是在瀏覽器中運(yùn)行的,必須創(chuàng)建一個(gè)HTML 文件,通過編寫HTML 語(yǔ)言代碼告訴瀏覽器載入何種Applet 以及如何運(yùn)行。

  例6.7 HelloWorld.java 源程序:
  import java.awt.Graphics; //引入圖形類Graphics
  import java.applet.Applet; //引入Applet類

  public class HelloWorld extends Applet {
      String hw_text ;
      public void init () { //init()方法是Applet首先執(zhí)行的方法
      hw_text = "Hello World";
      }


      public void paint(Graphics g) {
      g.drawString (hw_text , 25, 25) ;
         //在坐標(biāo)為(25,25)的地方顯示字符串hw_text


      }
  }

  Applet程序編寫完后,首先要用java編譯器編譯成為字節(jié)碼文件,然后編寫相應(yīng)的HTML文件才能夠正常執(zhí)行,例如為運(yùn)行上面的Applet程序所編寫的HTML文件HelloWorld.html如下:

  
  
  
  

  6.3.1 Applet 介紹(2)

  2.Applet的 安全性

  "沙箱"機(jī)制:Java虛擬機(jī)為Applet提供能夠良好運(yùn)行的沙箱,一旦它們?cè)噲D離開沙箱則會(huì)被禁止。

  由于小應(yīng)用程序是通過網(wǎng)絡(luò)傳遞的,這就不可避免地使人想到會(huì)發(fā)生安全問題。例如有人編寫惡意程序通過小應(yīng)用程序讀取用戶密碼并散播到網(wǎng)絡(luò)上,這將會(huì)是一件非常可怕的事情。所以,必須對(duì)小應(yīng)用程序進(jìn)行限制。

  瀏覽器禁止Applet執(zhí)行下列操作:
  (1)在運(yùn)行時(shí)調(diào)用其它程序。
  (2)文件讀寫操作。
  (3)裝載動(dòng)態(tài)連接庫(kù)和調(diào)用任何本地方法。
  (4)試圖打開一個(gè)socket進(jìn)行網(wǎng)絡(luò)通信,但是所連接的主機(jī)并不是提供Applet的主機(jī)。

  ◇ Applet的類層次:

  

  ◇ Applet的生命周期

  小應(yīng)用程序的生命周期相對(duì)于Application而言較為復(fù)雜。在其生命周期中涉及到Applet類的四個(gè)方法(也被JApplet類繼承):init()、start()、stop()和destroy()。下面首先用圖來表示一個(gè)小應(yīng)用程序的生命周期,然后再簡(jiǎn)要描述這四個(gè)方法。 看圖

  Applet的生命周期中有四個(gè)狀態(tài):初始態(tài)、運(yùn)行態(tài)、停止態(tài)和消亡態(tài)。當(dāng)程序執(zhí)行完init()方法以后,Applet程序就進(jìn)入了初始態(tài);然后馬上執(zhí)行start()方法,Applet程序進(jìn)入運(yùn)行態(tài);當(dāng)Applet程序所在的瀏覽器圖標(biāo)化或者是轉(zhuǎn)入其它頁(yè)面時(shí),該Applet程序馬上執(zhí)行stop()方法,Applet程序進(jìn)入停止態(tài);在停止態(tài)中,如果瀏覽器又重新裝載該Applet程序所在的頁(yè)面,或者是瀏覽器從圖標(biāo)中復(fù)原,則Applet程序馬上調(diào)用start()方法,進(jìn)入運(yùn)行態(tài);當(dāng)然,在停止態(tài)時(shí),如果瀏覽器關(guān)閉,則Applet程序調(diào)用destroy()方法,進(jìn)入消亡態(tài)。

  ◇ Applet的主要方法:

  1. init( )
  創(chuàng)建Applet時(shí)執(zhí)行,只執(zhí)行一次
  當(dāng)小應(yīng)用程序第一次被支持Java的瀏覽器加載時(shí),便執(zhí)行該方法。在小應(yīng)用程序的生命周期中,只執(zhí)行一次該方法,因此可以在其中進(jìn)行一些只執(zhí)行一次的初始化操作,如處理由瀏覽器傳遞進(jìn)來的參數(shù)、添加用戶接口組件、加載圖像和聲音文件等。
  小應(yīng)用程序有默認(rèn)的構(gòu)造方法,但它習(xí)慣于在init()方法中執(zhí)行所有的初始化,而不是在默認(rèn)的構(gòu)造方法內(nèi)。

  2.start( )
  多次執(zhí)行,當(dāng)瀏覽器從圖標(biāo)恢復(fù)成窗口,或者是返回該主頁(yè)時(shí)執(zhí)行。
  系統(tǒng)在調(diào)用完init()方法之后,將自動(dòng)調(diào)用start()方法。而且每當(dāng)瀏覽器從圖標(biāo)恢復(fù)為窗口時(shí),或者用戶離開包含該小應(yīng)用程序的主頁(yè)后又再返回時(shí),系統(tǒng)都會(huì)再執(zhí)行一遍start()方法。start()方法在小應(yīng)用程序的生命周期中被調(diào)用多次,以啟動(dòng)小應(yīng)用程序的執(zhí)行,這一點(diǎn)與init()方法不同。該方法是小應(yīng)用程序的主體,在其中可以執(zhí)行一些需要重復(fù)執(zhí)行的任務(wù)或者重新激活一個(gè)線程,例如開始動(dòng)畫或播放聲音等。

  3.stop( )
  多次執(zhí)行,當(dāng)瀏覽器變成圖標(biāo)時(shí),或者是離開主頁(yè)時(shí)執(zhí)行,主要功能是停止一些耗用系統(tǒng)資源的工作,。
  與start()相反,當(dāng)用戶離開小應(yīng)用程序所在頁(yè)面或?yàn)g覽器變成圖標(biāo)時(shí),會(huì)自動(dòng)調(diào)用stop()方法。因此,該方法在生命周期中也被多次調(diào)用。這樣使得可以在用戶并不注意小應(yīng)用程序的時(shí)候,停止一些耗用系統(tǒng)資源的工作(如中斷一個(gè)線程),以免影響系統(tǒng)的運(yùn)行速度,且并不需要去人為地去調(diào)用該方法。如果你的小應(yīng)用程序中不包含動(dòng)畫、聲音等程序,通常也不必重載該方法。

  4.destroy( )
  用來釋放資源,在stop( )之后執(zhí)行
  瀏覽器正常關(guān)閉時(shí),Java自動(dòng)調(diào)用這個(gè)方法。destroy()方法用于回收任何一個(gè)與系統(tǒng)無關(guān)的內(nèi)存資源。當(dāng)然,如果這個(gè)小應(yīng)用程序仍然處于活動(dòng)狀態(tài),Java會(huì)在調(diào)用destroy()之前,調(diào)用stop()方法。

  下面的例子使用了小應(yīng)用程序生命周期中的這幾個(gè)方法。
  例6.8
  import java.awt.Graphics;
  import java.applet.Applet;
  public class HWloop extends Applet {
     AudioClip sound; //聲音片斷對(duì)象
     public void init( ){
        sound=getAudioClip("audio/hello.au"); //獲得聲音片斷
     }
     public void paint(Graphics g) {
        g.drawString("hello Audio",25,25); //顯示字符串
     }


  public void start( )
     {
        sound.loop( ); //聲音片斷開始播放
     }
  public void stop( )
     {
        sound.stop( ); //聲音片斷停止
        }
  }

  在本例子中,Applet開始執(zhí)行后就不停的播放聲音,如果瀏覽器圖標(biāo)化或者是轉(zhuǎn)到其它頁(yè)面,則聲音停止播放;如果瀏覽器恢復(fù)正;蛘呤菑钠渌(yè)面跳回,則程序繼續(xù)播放聲音。

  由于Applet程序要嵌入到HTML文件中才能夠正常執(zhí)行,下面介紹與Applet程序有關(guān)的HTML文件標(biāo)記。

  
  [archive=archiveList] //同一個(gè)codebase中需預(yù)先下載的文件
  code=appletFile.class //applet的名稱
  width=pixels height=pixels //applet的初始顯示空間
  [codebase=codebaseURL] //代碼的地址
  [alt=alternateText] //如果瀏覽器不支持applet時(shí),顯示的替代文本
  [name=appletInstanceName]
           //給該applet取名,用于同頁(yè)面applet之間的通信
  [align=alignment] //對(duì)齊方式,如left,right,top,baseline...
  [vspace=pixels] [hspace=pixels] //預(yù)留的邊緣空白
  >
  []
  []
  …… //參數(shù)名稱及其值
  [alternateHTML]
  


  注意:
  1)不支持Java的瀏覽器會(huì)把之間的普通HTML文檔顯示出來;支持Java的瀏覽器,則把其中的普通HTML文檔忽略。
  2)AppletViewer僅支持標(biāo)記,其它標(biāo)記不會(huì)被顯示出來。

  經(jīng)過精心設(shè)計(jì),可以使java程序同時(shí)是Applet與Application,如下例所示:

  例6.9
   import java.awt.*;
   import java.awt.event.*;
   public class AppletApp extends Applet {
      public void main(String args[]) {
        Frame frame=new Frame("Application"); //構(gòu)造一個(gè)Frame
        AppletApp app=new AppletApp();
        frame.add("Center",app);
        frame.setSize(200,200); //改變Frame的尺寸

   frame.validate();
   frame.setVisible(true); //使Frame可見
   frame.addWindwoListener(new WindowControl(app));
                    //給Frame加入監(jiān)聽器
   app.init(); //初始化Applet
   app.start(); //運(yùn)行該Applet
   }
      public void paint(Graphics g) { //重畫方法
        g.drawString("hello world",25,25);
      }
      public void destroy(){
        System.exit(0);
      }
   }

   class WindowControl extends WindowAdapter { //監(jiān)聽器類
      Applet c;
      public WindowControl(Applet c) { //構(gòu)造函數(shù)
        this.c=c;
      }
      public void windowClosing(WindowEvent e) {
                   //關(guān)閉窗口時(shí)調(diào)用的方法
        c.destroy( );
      }
   }

  6.3.2 Applet的AWT繪制

   看圖

  Applet程序中所采用的AWT的繪圖機(jī)制主要涉及三個(gè)方法:paint()方法、update()方法和repaint()方法,update()方法和paint()方法都有一個(gè)Graphics類參數(shù)。Graphics是畫圖的關(guān)鍵,它可以支持兩種繪圖:一種是基本的繪圖,如:畫線、矩形、圓等;另一種是畫圖象,主要用于動(dòng)畫制作。

  要進(jìn)行繪圖,首先要找到一個(gè)Graphics類的對(duì)象。update()方法和paint()方法所傳遞的參數(shù)都是Graphics類的對(duì)象,因此主要是通過重載它們來進(jìn)行繪圖,這是在動(dòng)畫程序中經(jīng)常使用的方法。我們還可以通過getGraphics()方法得到一個(gè)Graphics類的對(duì)象,這個(gè)對(duì)象和update()方法和paint()方法中所傳遞的對(duì)象一樣,都是該成員所對(duì)應(yīng)的Graphics類的對(duì)象。得到了Graphics類的對(duì)象,就可使用各種繪圖方法。

  Graphics中提供的圖形繪制方法有:
  paint( ) //進(jìn)行繪圖的具體操作,必須有程序員重寫
  update( ) //用于更新圖形,先清除背景、前景,再調(diào)用paint()
  repaint( ) /*用于重繪圖形,在組件外形發(fā)生變化,即大小改變或位置移動(dòng)時(shí),repaint( )方法立即被系統(tǒng)自動(dòng)調(diào)用,而實(shí)際上repaint()方法是自動(dòng)調(diào)用update()方法*/

  下面的方法支持基本的繪圖和畫圖像:
  void drawLine( )
  void drawArc( )
  void drawPolygon( )
  void drawRect( )
  void drawRoundRect( )
  void fill3DRect( )
  void fillOval( )
  java.awt.Graphics類
  
  輸出文字:
  void drawBytes( )
  void drawChars( )
  void drawString( )