Java - Kiến thức cơ bản về Applet

An appletlà một chương trình Java chạy trong trình duyệt Web. Một applet có thể là một ứng dụng Java đầy đủ chức năng vì nó có toàn bộ Java API.

Có một số khác biệt quan trọng giữa một applet và một ứng dụng Java độc lập, bao gồm những điều sau:

  • Applet là một lớp Java mở rộng lớp java.applet.Applet.

  • Một phương thức main () không được gọi trên một applet và một lớp applet sẽ không định nghĩa main ().

  • Applet được thiết kế để nhúng trong trang HTML.

  • Khi người dùng xem một trang HTML có chứa applet, mã của applet sẽ được tải xuống máy của người dùng.

  • Cần có JVM để xem một applet. JVM có thể là một trình cắm thêm của trình duyệt Web hoặc một môi trường thời gian chạy riêng biệt.

  • JVM trên máy của người dùng tạo một thể hiện của lớp applet và gọi các phương thức khác nhau trong thời gian tồn tại của applet.

  • Applet có các quy tắc bảo mật nghiêm ngặt được thực thi bởi trình duyệt Web. Bảo mật của một applet thường được gọi là bảo mật hộp cát, so sánh applet với một đứa trẻ đang chơi trong hộp cát với nhiều quy tắc khác nhau phải tuân theo.

  • Các lớp khác mà applet cần có thể được tải xuống trong một tệp Java Archive (JAR).

Vòng đời của một Applet

Bốn phương thức trong lớp Applet cung cấp cho bạn khung mà bạn xây dựng bất kỳ applet nghiêm túc nào -

  • init- Phương thức này dành cho bất kỳ quá trình khởi tạo nào cần thiết cho applet của bạn. Nó được gọi sau khi các thẻ param bên trong thẻ applet đã được xử lý.

  • start- Phương thức này tự động được gọi sau khi trình duyệt gọi phương thức init. Nó cũng được gọi bất cứ khi nào người dùng quay lại trang chứa applet sau khi đã chuyển sang các trang khác.

  • stop- Phương thức này tự động được gọi khi người dùng di chuyển khỏi trang mà applet nằm trên đó. Do đó, nó có thể được gọi nhiều lần trong cùng một applet.

  • destroy- Phương thức này chỉ được gọi khi trình duyệt tắt bình thường. Bởi vì các applet có nghĩa là sống trên một trang HTML, thông thường bạn không nên để lại tài nguyên sau khi người dùng rời khỏi trang có chứa applet.

  • paint- Được gọi ngay sau phương thức start () và bất cứ lúc nào applet cần sơn lại chính nó trong trình duyệt. Phương thức paint () thực sự được kế thừa từ java.awt.

Applet "Xin chào, Thế giới"

Sau đây là một applet đơn giản có tên HelloWorldApplet.java -

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

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

Các câu lệnh nhập này đưa các lớp vào phạm vi của lớp applet của chúng ta -

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

Nếu không có các câu lệnh nhập đó, trình biên dịch Java sẽ không nhận ra các lớp Applet và Graphics, mà lớp applet đề cập đến.

Lớp Applet

Mỗi applet là một phần mở rộng của lớp java.applet.Applet . Lớp Applet cơ sở cung cấp các phương thức mà một lớp Applet dẫn xuất có thể gọi để lấy thông tin và dịch vụ từ ngữ cảnh trình duyệt.

Chúng bao gồm các phương pháp thực hiện như sau:

  • Nhận thông số applet
  • Lấy vị trí mạng của tệp HTML có chứa applet
  • Lấy vị trí mạng của thư mục lớp applet
  • In thông báo trạng thái trong trình duyệt
  • Tìm nạp hình ảnh
  • Tìm nạp một đoạn âm thanh
  • Phát một đoạn âm thanh
  • Thay đổi kích thước của applet

Ngoài ra, lớp Applet cung cấp một giao diện mà qua đó người xem hoặc trình duyệt lấy thông tin về applet và điều khiển việc thực thi của applet. Người xem có thể -

  • Yêu cầu thông tin về tác giả, phiên bản và bản quyền của applet
  • Yêu cầu mô tả các tham số mà applet nhận dạng
  • Khởi tạo applet
  • Hủy applet
  • Bắt đầu thực thi applet
  • Dừng quá trình thực thi của applet

Lớp Applet cung cấp các triển khai mặc định của mỗi phương thức này. Những triển khai đó có thể bị ghi đè khi cần thiết.

Applet "Xin chào, Thế giới" đã hoàn chỉnh. Phương pháp duy nhất được ghi đè là phương pháp sơn.

Gọi một Applet

Một applet có thể được gọi bằng cách nhúng các lệnh vào một tệp HTML và xem tệp đó thông qua trình xem applet hoặc trình duyệt hỗ trợ Java.

Thẻ <applet> là cơ sở để nhúng một applet vào tệp HTML. Sau đây là một ví dụ gọi applet "Hello, World" -

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

Note- Bạn có thể tham khảo HTML Applet Tag để hiểu thêm về cách gọi applet từ HTML.

Thuộc tính mã của thẻ <applet> là bắt buộc. Nó chỉ định lớp Applet để chạy. Chiều rộng và chiều cao cũng được yêu cầu để chỉ định kích thước ban đầu của bảng điều khiển mà một applet chạy. Chỉ thị applet phải được đóng bằng thẻ </applet>.

Nếu một applet nhận tham số, các giá trị có thể được chuyển cho các tham số bằng cách thêm thẻ <param> vào giữa <applet> và </applet>. Trình duyệt bỏ qua văn bản và các thẻ khác giữa các thẻ applet.

Các trình duyệt không hỗ trợ Java không xử lý <applet> và </applet>. Do đó, bất kỳ thứ gì xuất hiện giữa các thẻ, không liên quan đến applet, đều có thể nhìn thấy trong các trình duyệt không hỗ trợ Java.

Trình xem hoặc trình duyệt tìm kiếm mã Java đã biên dịch tại vị trí của tài liệu. Để chỉ định khác, hãy sử dụng thuộc tính codebase của thẻ <applet> như minh họa -

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

Nếu một applet nằm trong một gói khác với gói mặc định, gói đang giữ phải được chỉ định trong thuộc tính mã bằng cách sử dụng ký tự dấu chấm (.) Để phân tách các thành phần gói / lớp. Ví dụ -

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

Nhận thông số Applet

Ví dụ sau minh họa cách làm cho một applet phản hồi với các tham số thiết lập được chỉ định trong tài liệu. Applet này hiển thị một mẫu bàn cờ có màu đen và màu thứ hai.

Màu thứ hai và kích thước của mỗi hình vuông có thể được chỉ định làm tham số cho applet trong tài liệu.

CheckerApplet nhận các tham số của nó trong phương thức init (). Nó cũng có thể nhận các tham số của nó trong phương thức paint (). Tuy nhiên, việc nhận các giá trị và lưu các cài đặt một lần khi bắt đầu applet, thay vì mỗi lần làm mới, rất tiện lợi và hiệu quả.

Trình xem applet hoặc trình duyệt gọi phương thức init () của mỗi applet mà nó chạy. Người xem gọi init () một lần, ngay sau khi tải applet. (Applet.init () được triển khai để không làm gì cả.) Ghi đè triển khai mặc định để chèn mã khởi tạo tùy chỉnh.

Phương thức Applet.getParameter () tìm nạp một tham số được cung cấp bởi tên của tham số (giá trị của tham số luôn là một chuỗi). Nếu giá trị là số hoặc dữ liệu không phải ký tự khác, thì chuỗi phải được phân tích cú pháp.

Sau đây là khung của 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) {}
}

Đây là phương thức init () và private parseSquareSize () của CheckerApplet -

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 gọi parseSquareSize () để phân tích cú pháp tham số squareSize. parseSquareSize () gọi phương thức thư viện Integer.parseInt (), phương thức này phân tích cú pháp một chuỗi và trả về một số nguyên. Integer.parseInt () ném một ngoại lệ bất cứ khi nào đối số của nó không hợp lệ.

Do đó, parseSquareSize () bắt các ngoại lệ, thay vì cho phép applet bị lỗi khi nhập sai.

Applet gọi parseColor () để phân tích cú pháp tham số màu thành giá trị Màu. parseColor () thực hiện một loạt các so sánh chuỗi để khớp giá trị tham số với tên của màu được xác định trước. Bạn cần triển khai các phương pháp này để làm cho applet này hoạt động.

Chỉ định tham số Applet

Sau đây là một ví dụ về tệp HTML với CheckerApplet được nhúng trong đó. Tệp HTML chỉ định cả hai tham số cho applet bằng thẻ <param>.

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

Note - Tên tham số không phân biệt chữ hoa chữ thường.

Chuyển đổi ứng dụng sang Applet

Thật dễ dàng để chuyển đổi một ứng dụng Java đồ họa (tức là một ứng dụng sử dụng AWT và bạn có thể bắt đầu với trình khởi chạy chương trình Java) thành một applet mà bạn có thể nhúng vào một trang web.

Sau đây là các bước cụ thể để chuyển đổi một ứng dụng thành một applet.

  • Tạo một trang HTML với thẻ thích hợp để tải mã applet.

  • Cung cấp một lớp con của lớp JApplet. Đặt lớp này ở chế độ công khai. Nếu không, không thể tải applet.

  • Loại bỏ phương thức chính trong ứng dụng. Không xây dựng một cửa sổ khung cho ứng dụng. Ứng dụng của bạn sẽ được hiển thị bên trong trình duyệt.

  • Di chuyển bất kỳ mã khởi tạo nào từ phương thức khởi tạo cửa sổ khung sang phương thức init của applet. Bạn không cần phải xây dựng đối tượng applet một cách rõ ràng. Trình duyệt khởi tạo nó cho bạn và gọi phương thức init.

  • Xóa cuộc gọi đến setSize; đối với các applet, việc định cỡ được thực hiện với các tham số chiều rộng và chiều cao trong tệp HTML.

  • Loại bỏ lệnh gọi setDefaultCloseOperation. Không thể đóng một applet; nó chấm dứt khi trình duyệt thoát.

  • Nếu ứng dụng gọi setTitle, hãy loại bỏ lệnh gọi phương thức. Applet không được có thanh tiêu đề. (Tất nhiên, bạn có thể đặt tiêu đề cho chính trang web bằng cách sử dụng thẻ tiêu đề HTML.)

  • Đừng gọi setVible (true). Applet được hiển thị tự động.

Xử lý sự kiện

Applet kế thừa một nhóm các phương thức xử lý sự kiện từ lớp Container. Lớp Container định nghĩa một số phương thức, chẳng hạn như processKeyEvent và processMouseEvent, để xử lý các loại sự kiện cụ thể và sau đó là một phương thức tóm tắt được gọi là processEvent.

Để phản ứng với một sự kiện, một applet phải ghi đè lên phương thức dành riêng cho sự kiện thích hợp.

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

Bây giờ, chúng ta hãy gọi applet này như sau:

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

Ban đầu, applet sẽ hiển thị "đang khởi tạo applet. Đang khởi động applet." Sau đó, một khi bạn nhấp vào bên trong hình chữ nhật, "đã nhấp chuột" cũng sẽ được hiển thị.

Hiển thị hình ảnh

Một applet có thể hiển thị hình ảnh có định dạng GIF, JPEG, BMP và các định dạng khác. Để hiển thị hình ảnh trong applet, bạn sử dụng phương thức drawImage () có trong lớp java.awt.Graphics.

Sau đây là một ví dụ minh họa tất cả các bước để hiển thị hình ảnh -

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

Bây giờ, chúng ta hãy gọi applet này như sau:

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

Phát âm thanh

Một applet có thể phát một tệp âm thanh được đại diện bởi giao diện AudioClip trong gói java.applet. Giao diện AudioClip có ba phương pháp, bao gồm:

  • public void play() - Phát đoạn âm thanh một lần, từ đầu.

  • public void loop() - Khiến đoạn âm thanh phát lại liên tục.

  • public void stop() - Dừng phát đoạn âm thanh.

Để lấy một đối tượng AudioClip, bạn phải gọi phương thức getAudioClip () của lớp Applet. Phương thức getAudioClip () trả về ngay lập tức, cho dù URL có phân giải thành tệp âm thanh thực hay không. Tệp âm thanh không được tải xuống cho đến khi cố gắng phát đoạn âm thanh.

Sau đây là ví dụ minh họa tất cả các bước để phát âm thanh -

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

Bây giờ, chúng ta hãy gọi applet này như sau:

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

Bạn có thể sử dụng test.wav trên PC của mình để kiểm tra ví dụ trên.