Java Applet 基礎(chǔ)

Java Applet 基礎(chǔ)

Applet 是一種 Java 程序境氢。它一般運(yùn)行在支持 Java 的 Web 瀏覽器內(nèi)

因為它有完整的 Java API 支持,所以 Applet 是一個全功能的 Java 應(yīng)用程序

注意: Applet 現(xiàn)在幾乎沒人使用毙沾,如果你是為了學(xué)習(xí)而學(xué)習(xí)可以繼續(xù)味咳,如果是初學(xué)者宏侍,希望你不要繼續(xù)

獨(dú)立的 Java 應(yīng)用程序和 applet 程序之間有很多重要的不同點(diǎn)

  1. Java 中 Applet 類繼承了 java.applet.Applet 類
  2. Applet 類沒有定義 main(),所以一個 Applet 程序不會調(diào)用 main() 方法
  3. Applet 被設(shè)計為嵌入在一個 HTML 頁面
  4. 當(dāng)用戶瀏覽包含 Applet 的 HTML 頁面芦昔,Applet 的代碼就被下載到用戶的機(jī)器上
  5. 要查看一個 Applet 需要 JVM迅脐。 JVM 可以是 Web 瀏覽器的一個插件,或一個獨(dú)立的運(yùn)行時環(huán)境
  6. 用戶機(jī)器上的 JVM 創(chuàng)建一個 Applet 類的實例疾嗅,并調(diào)用 Applet 生命周期過程中的各種方法
  7. Applet 有 Web 瀏覽器強(qiáng)制執(zhí)行的嚴(yán)格的安全規(guī)則外厂,Applet 的安全機(jī)制被稱為沙箱安全
  8. Applet 需要的其他類可以用 Java 歸檔(JAR)文件的形式下載下來

Applet 的生命周期

Applet 類中的五個方法提供了一個框架,我們可以在該框架上開發(fā)小程序

  1. init: 該方法的目的是為你的 Applet 提供所需的任何初始化代承。在 Applet 標(biāo)記內(nèi)的 param 標(biāo)簽被處理后調(diào)用該方法
  2. start: 瀏覽器調(diào)用 init 方法后汁蝶,該方法被自動調(diào)用。每當(dāng)用戶從其他頁面返回到包含 Applet 的頁面時论悴,則調(diào)用該方法
  3. stop: 當(dāng)用戶從包含 Applet 的頁面移除的時候掖棉,該方法自動被調(diào)用。因此膀估,可以在相同的 Applet 中反復(fù)調(diào)用該方法
  4. destroy: 此方法僅當(dāng)瀏覽器正常關(guān)閉時調(diào)用幔亥。因為 Applet 只有在 HTML 網(wǎng)頁上有效,所以你不應(yīng)該在用戶離開包含 Applet 的頁面后遺漏任何資源
  5. paint: 該方法在 start() 方法之后立即被調(diào)用察纯,或者在 Applet 需要重繪在瀏覽器的時候調(diào)用帕棉。paint() 方法實際上繼承于 java.awt

"Hello, World" Applet

下面的范例是一個簡單的 Applet 程序 HelloWorldApplet.java

import java.applet.*;
import java.awt.*;

public class HelloWorldApplet extends Applet
{
   public void paint (Graphics g)
   {
      g.drawString ("Hello World", 25, 50);
   }
}

import 語句將以下類導(dǎo)入到 Applet 類中

java.applet.Applet
java.awt.Graphics

沒有這些 import 語句针肥,Java 編譯器就識別不了 Applet 和 Graphics 類

Applet 類

每一個 Applet 都是 java.applet.Applet 類的子類,基礎(chǔ)的 Applet 類提供了供衍生類調(diào)用的方法,以此來得到瀏覽器上下文的信息和服務(wù)

這些方法做了如下事情

  • 得到 Applet 的參數(shù)
  • 得到包含 Applet 的 HTML 文件的網(wǎng)絡(luò)位置
  • 得到 Applet 類目錄的網(wǎng)絡(luò)位置
  • 打印瀏覽器的狀態(tài)信息
  • 獲取一張圖片
  • 獲取一個音頻片段
  • 播放一個音頻片段
  • 調(diào)整此 Applet 的大小

除此之外香伴,Applet 類還提供了一個接口慰枕,該接口供 Viewer 或瀏覽器來獲取 Applet 的信息,并且來控制 Applet 的執(zhí)行

Viewer 可能是

  • 請求 Applet 作者即纲、版本和版權(quán)的信息
  • 請求 Applet 識別的參數(shù)的描述
  • 初始化 Applet
  • 銷毀 Applet
  • 開始執(zhí)行 Applet
  • 結(jié)束執(zhí)行 Applet

Applet 類提供了對這些方法的默認(rèn)實現(xiàn)具帮,這些方法可以在需要的時候重寫

"Hello,World" applet 都是按標(biāo)準(zhǔn)編寫的

唯一被重寫的方法是 paint 方法

Applet 的調(diào)用

Applet 是一種 Java 程序

Applet 一般運(yùn)行在支持 Java 的 Web 瀏覽器內(nèi)

因為 Applet 有完整的 Java API 支持崇裁,所以 Applet 是一個全功能的 Java 應(yīng)用程序

<applet> 標(biāo)簽是在 HTML 文件中嵌入 Applet 的基礎(chǔ)

下面的代碼調(diào)用了 "Hello World" applet

<!DOCTYPE html>
<meta charset="utf-8">
<title>The Hello, World Applet</title>
<hr />
<applet code="HelloWorldApplet.class" width="320" height="120">
>If your browser was Java-enabled, a "Hello, World"
message would appear here.
</applet>
<hr>
</html>

我們可以參照 HTML Applet 標(biāo)簽來更多的了解從 HTML 中調(diào)用 applet 的方法

<applet> 標(biāo)簽的屬性指定了要運(yùn)行的 Applet 類。width 和 height 用來指定 Applet 運(yùn)行面板的初始大小束昵。Applet 必須使用 </applet> 標(biāo)簽來關(guān)閉

如果 Applet 接受參數(shù)拔稳,那么參數(shù)的值需要在 <param> 標(biāo)簽里添加,該標(biāo)簽位于 <applet> 和 </applet> 之間锹雏。瀏覽器忽略了 applet 標(biāo)簽之間的文本和其他標(biāo)簽

不支持 Java 的瀏覽器不能執(zhí)行 <applet> 和 </applet>巴比。因此,在標(biāo)簽之間顯示并且和 applet 沒有關(guān)系的任何東西礁遵,在不支持的 Java 的瀏覽器里是可見的

Viewer 或者瀏覽器在文檔的位置尋找編譯過的 Java 代碼轻绞,要指定文檔的路徑,得使用 <applet> 標(biāo)簽的 codebase 屬性指定

<applet codebase="http://amrood.com/applets"
code="HelloWorldApplet.class" width="320" height="120">

如果 Applet 所在一個包中而不是默認(rèn)包佣耐,那么所在的包必須在 code 屬性里指定

<applet code="mypackage.subpackage.TestApplet.class"
           width="320" height="120">

獲得 applet 參數(shù)

下面的范例演示了如何使用一個 Applet 響應(yīng)來設(shè)置文件中指定的參數(shù)

該 Applet 顯示了一個黑色棋盤圖案和第二種顏色

第二種顏色和每一列的大小通過文檔中的 Applet 的參數(shù)指定

CheckerApplet 在 init() 方法里得到它的參數(shù)政勃。也可以在 paint() 方法里得到它的參數(shù)。然而兼砖,在 Applet 開始得到值并保存了設(shè)置奸远,而不是每一次刷新的時候都得到值,這樣是很方便讽挟,并且高效的

Applet viewer 或者瀏覽器在 Applet 每次運(yùn)行的時候調(diào)用 init() 方法懒叛。在加載 Applet 之后,Viewer 立即調(diào)用 init() 方法 ( Applet.init()什么也沒做 ) 耽梅,重寫該方法的默認(rèn)實現(xiàn)薛窥,添加一些自定義的初始化代碼

Applet.getParameter() 方法通過給出參數(shù)名稱得到參數(shù)值。如果得到的值是數(shù)字或者其他非字符數(shù)據(jù)眼姐,那么必須解析為字符串類型

import java.applet.*;
import java.awt.*;
public class CheckerApplet extends Applet
{
   int squareSize = 50;// 初始化默認(rèn)大小
   public void init () {}
   private void parseSquareSize (String param) {}
   private Color parseColor (String param) {}
   public void paint (Graphics g) {}
}

下面是 CheckerApplet 類的 init() 方法和私有的 parseSquareSize() 方法

public void init ()
{
   String squareSizeParam = getParameter ("squareSize");
   parseSquareSize (squareSizeParam);
   String colorParam = getParameter ("color");
   Color fg = parseColor (colorParam);
   setBackground (Color.black);
   setForeground (fg);
}
private void parseSquareSize (String param)
{
   if (param == null) return;
   try {
      squareSize = Integer.parseInt (param);
   }
   catch (Exception e) {
     // 保留默認(rèn)值
   }
}

該 Applet 調(diào)用 parseSquareSize()诅迷,來解析 squareSize 參數(shù)。parseSquareSize() 調(diào)用了庫方法 Integer. parseInt() 該方法將一個字符串解析為一個整數(shù)众旗,當(dāng)參數(shù)無效的時候竟贯,Integer.parseInt() 拋出異常

因此,parseSquareSize() 方法也是捕獲異常的逝钥,并不允許 Applet 接受無效的輸入

Applet 調(diào)用 parseColor()方法將顏色參數(shù)解析為一個 Color 值屑那。parseColor() 方法做了一系列字符串的比較拱镐,來匹配參數(shù)的值和預(yù)定義顏色的名字。你需要實現(xiàn)這些方法來使 Applet 工作

指定 applet 參數(shù)

下面的范例是一個 HTML 文件持际,其中嵌入了 CheckerApplet 類

HTML 文件通過使用 <param> 標(biāo)簽的方法給 applet 指定了兩個參數(shù)

<!DOCTYPE html>
<meta charset="utf-8">
<title>Checkerboard Applet</title>
<hr />
<applet code="CheckerApplet.class" width="480" height="320">
<param name="color" value="blue">
<param name="squaresize" value="30">
</applet>
<hr/>

應(yīng)用程序轉(zhuǎn)換成 Applet

將圖形化的 Java 應(yīng)用程序 ( 使用 AWT 的應(yīng)用程序和使用 java 程序啟動器啟動的程序 ( 轉(zhuǎn)換成嵌入在 web 頁面里的 applet 是很簡單的

下面是將應(yīng)用程序轉(zhuǎn)換成 Applet 的幾個步驟

  1. 編寫一個 HTML 頁面沃琅,該頁面帶有能加載 applet 代碼的標(biāo)簽
  2. 編寫一個 JApplet 類的子類,將該類設(shè)置為 public蜘欲。否則益眉,Applet 不能被加載
  3. 消除應(yīng)用程序的 main()方法。不要為應(yīng)用程序構(gòu)造框架窗口姥份,因為你的應(yīng)用程序要顯示在瀏覽器中
  4. 將應(yīng)用程序中框架窗口的構(gòu)造方法里的初始化代碼移到 Applet 的 init() 方法中郭脂,你不必顯示的構(gòu)造 Applet 對象,瀏覽器將通過調(diào)用 init() 方法來實例化一個對象
  5. 移除對 setSize() 方法的調(diào)用澈歉,對于 Applet 來講展鸡,大小已經(jīng)通過 HTML 文件里的 width 和 height 參數(shù)設(shè)定好了
  6. 移除對 setDefaultCloseOperation() 方法的調(diào)用。Applet 不能被關(guān)閉埃难,它隨著瀏覽器的退出而終止
  7. 如果應(yīng)用程序調(diào)用了 setTitle() 方法莹弊,消除對該方法的調(diào)用。applet 不能有標(biāo)題欄涡尘。(當(dāng)然你可以給通過 html 的 title 標(biāo)簽給網(wǎng)頁自身命名)
  8. 不要調(diào)用 setVisible(true),Applet 是自動顯示的

事件處理

Applet 類從 Container 類繼承了許多事件處理方法

Container 類定義了幾個方法忍弛,例如:processKeyEvent() 和processMouseEvent(),用來處理特別類型的事件考抄,還有一個捕獲所有事件的方法叫做 processEvent

為了響應(yīng)一個事件细疚,Applet 必須重寫合適的事件處理方法

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;

public class ExampleEventHandling extends Applet
                             implements MouseListener {

    StringBuffer strBuffer;

    public void init() {
         addMouseListener(this);
         strBuffer = new StringBuffer();
        addItem("initializing the apple ");
    }

    public void start() {
        addItem("starting the applet ");
    }

    public void stop() {
        addItem("stopping the applet ");
    }

    public void destroy() {
        addItem("unloading the applet");
    }

    void addItem(String word) {
        System.out.println(word);
        strBuffer.append(word);
        repaint();
    }

    public void paint(Graphics g) {
         //Draw a Rectangle around the applet's display area.
        g.drawRect(0, 0,
                      getWidth() - 1,
                      getHeight() - 1);

         //display the string inside the rectangle.
        g.drawString(strBuffer.toString(), 10, 20);
    }

    public void mouseEntered(MouseEvent event) {
    }
    public void mouseExited(MouseEvent event) {
    }
    public void mousePressed(MouseEvent event) {
    }
    public void mouseReleased(MouseEvent event) {
    }

    public void mouseClicked(MouseEvent event) {
         addItem("mouse clicked! ");
    }
}

調(diào)用該 Applet

<!DOCTYPE html>
<meta charset="utf-8">
<title>Event Handling</title>
<hr>
<applet code="ExampleEventHandling.class"
width="300" height="300">
</applet>
<hr>

最開始運(yùn)行,Applet 顯示 "initializing the applet. Starting the applet."川梅,然后點(diǎn)擊矩形框惠昔,就會顯示 "mouse clicked"

顯示圖片

Applet 能顯示 GIF,JPEG,BMP 等其它格式的圖片

為了在 Applet 中顯示圖片,需要使用 java.awt.Graphics 類的 drawImage() 方法

下面的范例演示了顯示圖片的所有步驟

import java.applet.*;
import java.awt.*;
import java.net.*;
public class ImageDemo extends Applet
{
  private Image image;
  private AppletContext context;
  public void init()
  {
      context = this.getAppletContext();
      String imageURL = this.getParameter("image");
      if(imageURL == null)
      {
         imageURL = "java.jpg";
      }
      try
      {
         URL url = new URL(this.getDocumentBase(), imageURL);
         image = context.getImage(url);
      }catch(MalformedURLException e)
      {
         e.printStackTrace();
         // Display in browser status bar
         context.showStatus("Could not load image!");
      }
   }
   public void paint(Graphics g)
   {
      context.showStatus("Displaying image");
      g.drawImage(image, 0, 0, 200, 84, null);
      g.drawString("www.javalicense.com", 35, 100);
   } 
}

然后可以向下面這樣調(diào)用該 applet

<!DOCTYPE html>
<meta charset="utf-8">
<title>The ImageDemo applet</title>
<applet code="ImageDemo.class" width="300" height="200">
<param name="image" value="java.jpg">
</applet>

播放音頻

Applet 能通過使用 java.applet 包中的 AudioClip 接口播放音頻

AudioClip 接口定義了三個方法

方法 說明
public void play() 從一開始播放音頻片段一次
public void loop() 循環(huán)播放音頻片段
public void stop() 停止播放音頻片段

為了得到 AudioClip 對象挑势,必須調(diào)用 Applet 類的 getAudioClip() 方法

無論 URL 指向的是否是一個真實的音頻文件镇防,該方法都會立即返回結(jié)果

直到要播放音頻文件時,該文件才會下載下來

下面的范例演示了播放音頻的所有步驟

import java.applet.*;
import java.awt.*;
import java.net.*;
public class AudioDemo extends Applet
{
   private AudioClip clip;
   private AppletContext context;
   public void init()
   {
      context = this.getAppletContext();
      String audioURL = this.getParameter("audio");
      if(audioURL == null)
      {
         audioURL = "default.au";
      }
      try
      {
         URL url = new URL(this.getDocumentBase(), audioURL);
         clip = context.getAudioClip(url);
      }catch(MalformedURLException e)
      {
         e.printStackTrace();
         context.showStatus("Could not load audio file!");
      }
   }
   public void start()
   {
      if(clip != null)
      {
         clip.loop();
      }
   }
   public void stop()
   {
      if(clip != null)
      {
         clip.stop();
      }
   }
}

然后可以向下面這樣調(diào)用 applet

<!DOCTYPE html>
<meta charset="utf-8">
<title>The ImageDemo applet</title>
<applet code="ImageDemo.class" width="0" height="0">
<param name="audio" value="test.wav">
</applet>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潮饱,一起剝皮案震驚了整個濱河市来氧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌香拉,老刑警劉巖啦扬,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凫碌,居然都是意外死亡扑毡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門盛险,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞄摊,“玉大人勋又,你說我怎么就攤上這事』恢模” “怎么了楔壤?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惯驼。 經(jīng)常有香客問我蹲嚣,道長,這世上最難降的妖魔是什么祟牲? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任隙畜,我火速辦了婚禮,結(jié)果婚禮上说贝,老公的妹妹穿的比我還像新娘议惰。我一直安慰自己,他們只是感情好狂丝,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布换淆。 她就那樣靜靜地躺著哗总,像睡著了一般几颜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讯屈,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天蛋哭,我揣著相機(jī)與錄音,去河邊找鬼涮母。 笑死谆趾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叛本。 我是一名探鬼主播沪蓬,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼来候!你這毒婦竟也來了跷叉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤营搅,失蹤者是張志新(化名)和其女友劉穎云挟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體转质,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡园欣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了休蟹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沸枯。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡日矫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辉饱,到底是詐尸還是另有隱情搬男,我是刑警寧澤椒功,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布傻铣,位于F島的核電站,受9級特大地震影響冰悠,放射性物質(zhì)發(fā)生泄漏姓惑。R本人自食惡果不足惜褐奴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望于毙。 院中可真熱鬧敦冬,春花似錦、人聲如沸唯沮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽介蛉。三九已至萌庆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間币旧,已是汗流浹背践险。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吹菱,地道東北人巍虫。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像鳍刷,于是被迫代替她去往敵國和親占遥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Applet 是一種 Java 程序输瓜。它一般運(yùn)行在支持 Java 的 Web 瀏覽器內(nèi)瓦胎。因為它有完整的 Java ...
    南風(fēng)_001閱讀 469評論 0 0
  • Applet 是一種 Java 程序。它一般運(yùn)行在支持 Java 的 Web 瀏覽器內(nèi)前痘。因為它有完整的 Java...
    JWking閱讀 1,405評論 0 1
  • 面向?qū)ο缶幊蹋∣OP) Java是一個支持并發(fā)凛捏、基于類和面向?qū)ο蟮挠嬎銠C(jī)編程語言。下面列出了面向?qū)ο筌浖_發(fā)的優(yōu)點(diǎn)...
    大家請叫我小杰閱讀 1,133評論 0 0
  • Java是一個支持并發(fā)芹缔、基于類和面向?qū)ο蟮挠嬎銠C(jī)編程語言坯癣。下面列出了面向?qū)ο筌浖_發(fā)的優(yōu)點(diǎn): 代碼開發(fā)模塊化,更易...
    安安靜靜寫代碼閱讀 1,098評論 0 8
  • 身邊有幾位朋友當(dāng)初一聽到我轉(zhuǎn)行去做理財工作了最欠,就問我有什么辦法可以分分鐘幫他們賺到錢示罗?當(dāng)然這只是開玩笑惩猫,但我...
    03a2046594b8閱讀 418評論 0 1