Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java APIs & 框架

Java 類引用

Java 有用資源

Java - Applet 基礎



一個Applet是一個在Web瀏覽器中執行的Java程式。Applet可以是一個功能齊全的Java應用程式,因為它可以使用整個Java API。

Applet和獨立Java應用程式之間存在一些重要區別,包括以下幾點:

  • Applet是一個擴充套件了java.applet.Applet類的Java類

  • Applet不會呼叫main()方法,Applet類也不會定義main()

  • Applet設計為嵌入HTML頁面。

  • 當用戶檢視包含Applet的HTML頁面時,Applet的程式碼將下載到使用者的計算機上。

  • 需要JVM來檢視Applet。JVM可以是Web瀏覽器的外掛或單獨的執行時環境。

  • 使用者計算機上的JVM建立Applet類的例項,並在Applet的生命週期中呼叫各種方法。

  • Applet具有Web瀏覽器強制執行的嚴格安全規則。Applet的安全通常被稱為沙箱安全,將Applet比作在沙箱中玩耍的孩子,必須遵守各種規則。

  • Applet需要的其他類可以打包在一個Java歸檔(JAR)檔案中下載。

Java中Applet的生命週期

Applet類中的四個方法為您構建任何嚴肅的Applet提供了框架:

  • init - 此方法用於Applet所需的任何初始化。在處理Applet標記內的param標記後呼叫此方法。

  • start - 在瀏覽器呼叫init方法後自動呼叫此方法。當用戶在訪問其他頁面後返回包含Applet的頁面時,也會呼叫此方法。

  • stop - 當用戶離開包含Applet的頁面時,會自動呼叫此方法。因此,它可以在同一個Applet中重複呼叫。

  • destroy - 此方法僅在瀏覽器正常關閉時呼叫。因為Applet旨在存在於HTML頁面上,所以當用戶離開包含Applet的頁面後,通常不應留下任何資源。

  • paint - 在start()方法之後立即呼叫,並且在Applet需要在瀏覽器中重新繪製自身時也會呼叫。paint()方法實際上是從java.awt繼承的。

Java Applet生命週期的流程

Applet生命週期方法會自動呼叫。下圖顯示了Applet生命週期的流程。

Flow of Java Applet Life Cycle

一個簡單的Java Applet“Hello, World”

下面是一個名為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類的作用域。

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

如果沒有這些匯入語句,Java編譯器將無法識別applet類引用的Applet和Graphics類。

Applet類

每個applet都是java.applet.Applet類的擴充套件。基礎Applet類提供了一些方法,派生的Applet類可以使用這些方法從瀏覽器環境中獲取資訊和服務。

這些方法包括:

  • 獲取applet引數
  • 獲取包含applet的HTML檔案的網路位置
  • 獲取applet類目錄的網路位置
  • 在瀏覽器中列印狀態訊息
  • 獲取影像
  • 獲取音訊剪輯
  • 播放音訊剪輯
  • 調整applet大小

此外,Applet類還提供了一個介面,檢視器或瀏覽器可以透過該介面獲取有關applet的資訊並控制applet的執行。檢視器可以:

  • 請求有關applet的作者、版本和版權的資訊
  • 請求applet識別的引數的描述
  • 初始化applet
  • 銷燬applet
  • 啟動applet的執行
  • 停止applet的執行

Applet類為每個方法提供了預設實現。可以根據需要覆蓋這些實現。

“Hello, World” applet 現在已經完整。唯一被重寫的方法是paint方法。

呼叫Applet

可以透過在HTML檔案中嵌入指令並在applet檢視器或支援Java的瀏覽器中檢視該檔案來呼叫applet。

<applet>標籤是將applet嵌入HTML檔案的基石。以下是一個呼叫“Hello, World” applet的示例:

<html>
   <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 標籤瞭解更多關於從HTML呼叫applet的資訊。

<applet>標籤的code屬性是必需的。它指定要執行的Applet類。width和height屬性也是必需的,用於指定applet執行的面板的初始大小。applet指令必須用</applet>標籤關閉。

如果applet需要引數,可以透過在<applet>和</applet>之間新增<param>標籤來傳遞引數的值。瀏覽器會忽略applet標籤之間的文字和其他標籤。

不支援Java的瀏覽器不會處理<applet>和</applet>。因此,在這些標籤之間出現的與applet無關的任何內容都可以在不支援Java的瀏覽器中看到。

檢視器或瀏覽器會在文件所在位置查詢已編譯的Java程式碼。要指定其他位置,請使用<applet>標籤的codebase屬性,如下所示:

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

如果applet位於預設包之外的包中,則必須在code屬性中使用句點字元(.)來分隔包/類元件,指定其所屬的包。例如:

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

獲取Applet引數

以下示例演示如何使applet響應文件中指定的設定引數。此applet顯示黑白和第二種顏色的棋盤圖案。

第二種顏色和每個方格的大小可以作為文件中applet的引數來指定。

CheckerApplet在其init()方法中獲取其引數。它也可以在paint()方法中獲取其引數。但是,在applet啟動時一次獲取值並儲存設定,而不是在每次重新整理時都獲取,這樣更方便、更高效。

applet檢視器或瀏覽器會呼叫其執行的每個applet的init()方法。檢視器會在載入applet後立即呼叫init()一次。(Applet.init()實現為空操作。)覆蓋預設實現以插入自定義初始化程式碼。

Applet.getParameter()方法根據引數的名稱獲取引數(引數的值始終是字串)。如果值是數字或其他非字元資料,則必須解析該字串。

以下是CheckerApplet.java的框架:

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呼叫parseSquareSize()來解析squareSize引數。parseSquareSize()呼叫庫方法Integer.parseInt(),該方法解析字串並返回整數。每當其引數無效時,Integer.parseInt()都會丟擲異常。

因此,parseSquareSize()捕獲異常,而不是允許applet因錯誤輸入而失敗。

applet呼叫parseColor()將顏色引數解析為Color值。parseColor()執行一系列字串比較,以將引數值與預定義顏色的名稱匹配。您需要實現這些方法才能使此applet工作。

指定Applet引數

以下是一個HTML檔案的示例,其中嵌入了CheckerApplet。HTML檔案透過<param>標籤指定applet的兩個引數。

示例

<html>
   <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>
</html>

注意 - 引數名稱不區分大小寫。

應用程式轉換為Applet

可以輕鬆地將圖形化Java應用程式(即使用AWT的應用程式,可以使用Java程式啟動器啟動)轉換為可以嵌入網頁的applet。

以下是將應用程式轉換為applet的具體步驟。

  • 建立一個HTML頁面,其中包含載入applet程式碼的相應標籤。

  • 提供一個JApplet類的子類。使這個類是公共的。否則,無法載入applet。

  • 消除應用程式中的main方法。不要為應用程式構建框架視窗。您的應用程式將在瀏覽器中顯示。

  • 將任何初始化程式碼從框架視窗建構函式移動到applet的init方法。您不需要顯式構造applet物件。瀏覽器會為您例項化它並呼叫init方法。

  • 刪除對setSize的呼叫;對於applet,大小調整是使用HTML檔案中的width和height引數完成的。

  • 刪除對setDefaultCloseOperation的呼叫。applet無法關閉;它在瀏覽器退出時終止。

  • 如果應用程式呼叫setTitle,則消除對該方法的呼叫。applet不能有標題欄。(當然,可以使用HTML標題標籤為網頁本身新增標題。)

  • 不要呼叫setVisible(true)。applet會自動顯示。

事件處理

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! ");
   }
}

現在,讓我們如下呼叫此applet:

<html>
   <title>Event Handling</title>
   <hr>
   <applet code = "ExampleEventHandling.class" 
      width = "300" height = "300">
   </applet>
   <hr>
</html>

最初,applet將顯示“正在初始化applet。正在啟動applet”。然後,一旦您單擊矩形內部,“滑鼠單擊”也將顯示。

顯示影像

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);
   }  
}

現在,讓我們如下呼叫此applet:

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "300" height = "200">
      <param name = "image" value = "java.jpg">
   </applet>
   <hr>
</html>

播放音訊

applet可以播放由java.applet包中的AudioClip介面表示的音訊檔案。AudioClip介面具有三種方法,包括:

  • public void play() - 從頭開始播放音訊剪輯一次。

  • public void loop() - 使音訊剪輯不斷重播。

  • public void stop() - 停止播放音訊剪輯。

要獲取AudioClip物件,必須呼叫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();
      }
   }
}

現在,讓我們如下呼叫此applet:

<html>
   <title>The ImageDemo applet</title>
   <hr>
   <applet code = "ImageDemo.class" width = "0" height = "0">
      <param name = "audio" value = "test.wav">
   </applet>
   <hr>
</html>

您可以使用您電腦上的test.wav來測試上述示例。

廣告