鍍金池/ 教程/ Java/ Java Applet 基礎(chǔ)
Java 接口
Java 方法
Java 數(shù)字
Java 條件判斷
Java 異常處理
Java 字符
Java 重寫
Java 網(wǎng)絡(luò)編程
Java 數(shù)據(jù)結(jié)構(gòu)
Java 的對象和類
Java 多線程
Java 封裝
Java 數(shù)組
Java Applet 基礎(chǔ)
Java 庫類
Java 抽象
Java 繼承
Java 正則表達式
Java 描述符的類型
Java 發(fā)送郵件
Java 序列化
Java 泛型
Java 多態(tài)
Java 變量類型
Java 基本數(shù)據(jù)類型
Java 包
Java 快速參考指南
Java 基本運算符
Java 概述
Java 字符串
Java 循環(huán)控制
Java 環(huán)境設(shè)置
Java 文件注釋
Java 文件和 I/O
Java 集合
Java 基本語法
Java 日期和時間

Java Applet 基礎(chǔ)

一個 Applet 是一個運行在網(wǎng)頁瀏覽器上的 Java 程序。一個 Applet 可以使一個全功能的 Java 應(yīng)用程序因為它在處理上擁有整個 Java API。

在一個 Applet 和一個獨立的 Java 應(yīng)用程序間有一些重要的不同,包括以下方面:

  • 一個 Applet 是繼承 java.applet.Applet 類的一個 Java 類。
  • main() 方法不在 Applet 上被調(diào)用,并且一個 applet 類將不定義 main()。
  • Applet 程序被設(shè)計嵌入到 HTML 頁面中。
  • 當一個用戶查看一個帶有 applet 的 HTML 頁面,applet 的代碼將被下載到用戶的機器中。
  • 需要 JVM 來查看一個 applet。JVM 可以是一個網(wǎng)頁瀏覽器的一個插件,也可以是單獨的運行環(huán)境。
  • 用戶機器上的 JVM 創(chuàng)建了 applet 類的實例并且在 applet 的生命周期中調(diào)用不同的方法。
  • Applets 有網(wǎng)頁瀏覽器實施的嚴格的安全規(guī)則。一個 applet 程序的安全性常常被稱作沙箱安全,這是將 applet 比作一個正在沙箱中的,必須遵守許多規(guī)則的孩子。
  • 其他 applet 需要的類可以在一個單獨的 Java Archive(JAR) 文件中下載。

一個 Applet 的生命周期

Applet 類中的四個方法給了你構(gòu)建 applet 程序時的框架:

  • init: 這個方法適用于你的 applet 程序所需要的任何初始化。它在 applet 標記中的參數(shù)標簽被處理后被調(diào)用。
  • start: 這個方法在瀏覽器調(diào)用 init 方法后被自動調(diào)用。它也在無論何時使用者在去其他頁面后返回到包含 applet 的頁面時被調(diào)用。
  • stop: 這個方法在使用者離開有 applet 所在的頁面時被自動調(diào)用。因此,它在同一個 applet 中能被重復(fù)調(diào)用。
  • destroy: 這個方法僅當瀏覽器正常關(guān)閉時被自動調(diào)用。因為 applet 程序是生存在 HTML 頁面上的,你不應(yīng)該在使用者離開有 applet 的網(wǎng)頁后留下資源。
  • paint: 在 start() 方法之后被立即調(diào)用,或是在 applet 需要在瀏覽器上重現(xiàn)它自身的任何時候。paint() 方法實際上是繼承自 java.awt。

一個 “Hello,World” Applet

以下是一個簡單的叫做 HelloWorldApplet.java 的 applet 程序:

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

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

這些引入的語句把類帶入我們的 applet 類的范圍內(nèi):

  • java.applet.Applet.
  • java.awt.Graphics.

沒有那些引入的語句,Java 編譯器將不會認出 applet 類所指的 Applet 和 Graphics 類。

Applet 類

每一個 applet 類都是 java.applet.Applet 類的延伸。基本的 Applet 類提供了一個派生的 Applet 類用來調(diào)用從瀏覽器獲取信息和服務(wù)的方法。

這還包括了做以下事情的方法:

  • 獲得 applet 參數(shù)
  • 獲得包含 applet 的 HTML 文件的網(wǎng)絡(luò)地址
  • 獲得 applet 類目錄的網(wǎng)絡(luò)地址
  • 在瀏覽器中打印狀態(tài)信息
  • 獲取一個圖像
  • 獲取一段音頻剪輯
  • 播放一段音頻剪輯
  • 調(diào)整 applet 的大小

此外,Applet 類通過觀察器和瀏覽器獲得有關(guān) applet 的信息和控制 applet 的執(zhí)行來提供一個接口。觀察者可能:

  • 需要作者的信息,版本和 applet 的版權(quán)
  • 需要 applet 識別的參數(shù)的描述
  • 初始化 applet
  • 銷毀 applet
  • 開始 applet 的執(zhí)行
  • 停止 applet 的執(zhí)行

調(diào)用一個 Applet 程序

一個 applet 可能被一個 HTML 文件中嵌入的指令文件調(diào)用并通過一個 applet 觀察器或者支持 Java 的瀏覽器查看文件。

標簽是在一個 HTML 文件中嵌入一個 applet 的基礎(chǔ)。以下是調(diào)用“Hello,World” applet 的例子: ``` The Hello, World Applet
If your browser was Java-enabled, a "Hello, World" message would appear here.
``` 標簽的 code 屬性是需要的。它指定 Applet 類運行。寬度和高度也是需要來規(guī)定 applet 運行的面板的初始大小。applet 指令必須用 標簽結(jié)束。 如果一個 applet 需要參數(shù),值可能通過在 間添加 標簽來傳給參數(shù)。 Java 不支持的瀏覽器不處理 。因此,任何出現(xiàn)在標簽之間的,和 applet 無關(guān)的,在 Java 不支持的瀏覽器內(nèi)都是可見的。 觀察器和瀏覽器在文件的地址尋找編譯好的 Java 代碼。否則指定,像下面這樣使用 標簽的 codebase 屬性: ``` ``` 如果一個 applet 常駐在一個包內(nèi)而不是默認,保存的包必須規(guī)定在 code 屬性內(nèi),使用句點字符(.)來分離包/類成分: ``` ``` ## 獲得 Applet 參數(shù) 下面的例子展示了如何進行 applet 響應(yīng)設(shè)置文檔中指定的參數(shù)。這個 applet 展示了黑色和第二種顏色的棋盤式樣式。 第二種顏色和每個方格的大小會由文件中的 applet 的參數(shù)所指定。 CheckerApplet 在 init() 方法中獲得它的參數(shù)。它也能在 paint() 方法中獲得它的參數(shù)。然而,在 applet 一開始就獲得值并保存設(shè)置,而不是在每次刷新時,是方便有效的。 applet 觀察器或者瀏覽器在每一個 applet 運行時調(diào)用 init() 方法。觀察器在加載 applet 程序后立即調(diào)用 init() 方法。(Applet.init() 實現(xiàn)后不做任何事)覆寫默認的實現(xiàn)來插入自定義初始化代碼。 Applet.getParameter() 方法獲得一個給定參數(shù)名稱的參數(shù)(參數(shù)的值總是一個字符串)。如果值是數(shù)值的或者其他非字符數(shù)據(jù),字符串必須被解析。 以下是 CheckerApplet.java 的構(gòu)架: ``` import java.applet.*; import java.awt.*; public class CheckerApplet extends Applet { int squareSize = 50;// initialized to default size 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) { // Let default value remain } } ``` applet 調(diào)用 parseSquareSize() 來解析 squareSize 參數(shù)。parseSquareSize() 調(diào)用 library 方法 Integer.parseInt(),它解析了一個字符串并返回一個整型。Integer.parseInt() 每當它的參數(shù)無效時就拋出一個異常。 因此,parseSquareSize() 捕獲一個異常,而不是允許 applet 因為錯誤的輸入失效。 applet 調(diào)用 parseColor() 來解析 color 參數(shù)成一個 Color 值。parseColor() 進行了一系列的字符串比較來將參數(shù)值和一個預(yù)定義的顏色進行匹配。你需要實現(xiàn)這些方法來進行 applet 工作。 ## 指定 Applet 參數(shù) 以下是一個有 CheckerApplet 嵌入的 HTML 文件的例子。HTML 文件通過 標簽的方法指定兩個 applet 的參數(shù)。 ``` Checkerboard Applet

``` **注意:** 參數(shù)名字不區(qū)分大小寫 ## 應(yīng)用程序轉(zhuǎn)換為 Applet 將一個圖形化的 Java 應(yīng)用程序(那就是,一個使用 AWT 并且你能用 Java 程序啟動器啟動的應(yīng)用程序)轉(zhuǎn)換為一個可以嵌入到一個網(wǎng)頁中的 applet 程序是簡單的。 這是將應(yīng)用程序轉(zhuǎn)換為 applet 的指定步驟。 - 制作一個有正確的標簽的 HTML 網(wǎng)頁來載入 applet 代碼。 - 提供一個 JApplet 類的子類。使這個類公開。否則,applet 不能不載入。 - 消除應(yīng)用程序中的 main 方法。不要為應(yīng)用程序構(gòu)建一個框架窗口。你的應(yīng)用程序?qū)⒃跒g覽器內(nèi)被展示。 - 將任何初始化代碼從框架窗口構(gòu)造函數(shù)移動到 applet 的 init 方法。你不需要精確地構(gòu)造 applet 對象。瀏覽器為你初始化了并且調(diào)用 init 方法。 - 移除對 setSize 的調(diào)用;對 applet 來說,調(diào)整寬度和高度的參數(shù)在 HTML 中已經(jīng)做好了。 - 移除對 setDefaultCloseOperation 的調(diào)用。一個 applet 不能關(guān)閉;它在瀏覽器退出時消失。 - 如果應(yīng)用程序調(diào)用 setTitle,消除了對方法的調(diào)用。Applet 不能擁有標題欄。(當然你可以用 HTML 標題標簽來給網(wǎng)頁定義自身標簽) - 不要調(diào)用 setVisible(true)。applet 自動設(shè)置了。 ## 事件處理 applet 從 Container 類中繼承了一組事件處理的方法。Container 類為解決特殊的時間類型,定義了幾種方法,比如 processKeyEvent 和 processMouseEvent,和一個萬能的叫做 processEvent 的方法。 為了使一個事件生效,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! "); } } ``` 現(xiàn)在,讓我們像這樣調(diào)用下面的 applet: ``` Event Handling

``` 最初,applet 將會展示 “初始化 applet,開始 applet”。然后一旦你點擊長方形內(nèi)的 “鼠標點擊” 將會顯示。 ## 顯示圖像 一個 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); } } ``` 現(xiàn)在,讓我們像這樣調(diào)用這個 applet: ``` The ImageDemo applet

``` ## 播放音頻 一個 applet 能播放由 java.applet 包內(nèi)的 AudioClip 接口表示的音頻。AudioClip 接口有三個方法,包括: - **public void play():** 從開始時,播放一次音頻片段。 - **public void loop():** 使音頻片段持續(xù)重復(fù)播放。 - **public void stop():** 停止播放音頻片段。 為了獲得一個 AudioClip 對象,你必須調(diào)用 Applet 類的 getAudioClip() 方法。getAudioClip() 方法立刻返回,無論 URL 是否解決一個真正的音頻片段。當播放音頻片段時它才被下載。 以下是播放音頻的所有步驟的一個例子: ``` 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(); } } } ``` 現(xiàn)在,讓我們調(diào)用這個 applet: ``` The ImageDemo applet

``` 你可以使用你電腦的 test.wav 來測試上面的例子。
下一篇:Java 序列化