Java - พื้นฐานของแอปเพล็ต

อัน appletเป็นโปรแกรม Java ที่ทำงานในเว็บเบราว์เซอร์ แอพเพล็ตสามารถเป็นแอปพลิเคชัน Java ที่ทำงานได้อย่างสมบูรณ์เนื่องจากมี Java API ทั้งหมดที่จำหน่าย

มีความแตกต่างที่สำคัญบางประการระหว่างแอพเพล็ตและแอ็พพลิเคชัน Java แบบสแตนด์อโลนรวมถึงสิ่งต่อไปนี้ -

  • แอพเพล็ตคือคลาส Java ที่ขยายคลาส java.applet.Applet

  • เมธอด main () ไม่ถูกเรียกใช้บนแอพเพล็ตและคลาสแอพเพล็ตจะไม่กำหนด main ()

  • แอปเพล็ตได้รับการออกแบบให้ฝังอยู่ในหน้า HTML

  • เมื่อผู้ใช้ดูเพจ HTML ที่มีแอพเพล็ตโค้ดสำหรับแอพเพล็ตจะถูกดาวน์โหลดไปยังเครื่องของผู้ใช้

  • จำเป็นต้องมี JVM เพื่อดูแอพเพล็ต JVM สามารถเป็นปลั๊กอินของเว็บเบราว์เซอร์หรือสภาพแวดล้อมรันไทม์แยกต่างหาก

  • JVM บนเครื่องของผู้ใช้สร้างอินสแตนซ์ของคลาสแอพเพล็ตและเรียกใช้วิธีการต่างๆในช่วงอายุของแอพเพล็ต

  • แอพเพล็ตมีกฎความปลอดภัยที่เข้มงวดซึ่งบังคับใช้โดยเว็บเบราว์เซอร์ การรักษาความปลอดภัยของแอพเพล็ตมักเรียกว่าการรักษาความปลอดภัยแบบแซนด์บ็อกซ์โดยเปรียบเทียบแอพเพล็ตกับเด็กที่เล่นในแซนด์บ็อกซ์กับกฎต่างๆที่ต้องปฏิบัติตาม

  • คลาสอื่น ๆ ที่แอพเพล็ตต้องการสามารถดาวน์โหลดได้ในไฟล์ Java Archive (JAR) ไฟล์เดียว

วงจรชีวิตของแอพเพล็ต

สี่วิธีในคลาส Applet ให้กรอบการทำงานที่คุณสร้างแอพเพล็ตที่จริงจัง -

  • init- วิธีนี้มีไว้สำหรับการเริ่มต้นใด ๆ ที่จำเป็นสำหรับแอพเพล็ตของคุณ เรียกว่าหลังจากที่แท็กพารามิเตอร์ภายในแท็กแอพเพล็ตได้รับการประมวลผลแล้ว

  • start- วิธีนี้เรียกโดยอัตโนมัติหลังจากเบราว์เซอร์เรียกใช้เมธอด init เรียกอีกอย่างว่าเมื่อใดก็ตามที่ผู้ใช้กลับไปยังหน้าที่มีแอพเพล็ตหลังจากออกไปที่หน้าอื่นแล้ว

  • stop- วิธีนี้เรียกโดยอัตโนมัติเมื่อผู้ใช้ย้ายออกจากหน้าที่แอพเพล็ตนั่งอยู่ ดังนั้นจึงสามารถเรียกซ้ำ ๆ ในแอพเพล็ตเดียวกันได้

  • destroy- วิธีนี้จะเรียกเมื่อเบราว์เซอร์ปิดตัวตามปกติเท่านั้น เนื่องจากแอพเพล็ตถูกกำหนดให้ใช้งานบนเพจ HTML โดยปกติคุณไม่ควรทิ้งทรัพยากรไว้ข้างหลังหลังจากที่ผู้ใช้ออกจากหน้าที่มีแอพเพล็ต

  • paint- เรียกใช้ทันทีหลังจากเมธอด start () และทุกครั้งที่แอพเพล็ตต้องทาสีใหม่ในเบราว์เซอร์ เมธอด paint () สืบทอดมาจาก java.awt

แอพเพล็ต "สวัสดีชาวโลก"

ต่อไปนี้เป็นแอพเพล็ตธรรมดาชื่อ HelloWorldApplet.java -

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

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

คำสั่งนำเข้าเหล่านี้นำคลาสเข้าสู่ขอบเขตของคลาสแอพเพล็ตของเรา -

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

หากไม่มีคำสั่งอิมพอร์ตเหล่านั้นคอมไพเลอร์ Java จะไม่รู้จักคลาส Applet และ Graphics ซึ่งคลาสแอพเพล็ตอ้างถึง

คลาส Applet

ทุกแอปเพล็เป็นส่วนขยายของชั้น java.applet.Applet คลาส Applet พื้นฐานจัดเตรียมเมธอดที่คลาส Applet ที่ได้รับอาจเรียกเพื่อขอรับข้อมูลและบริการจากบริบทของเบราว์เซอร์

ซึ่งรวมถึงวิธีการดังต่อไปนี้ -

  • รับพารามิเตอร์แอพเพล็ต
  • รับตำแหน่งเครือข่ายของไฟล์ HTML ที่มีแอพเพล็ต
  • รับตำแหน่งเครือข่ายของไดเร็กทอรีคลาสแอพเพล็ต
  • พิมพ์ข้อความแสดงสถานะในเบราว์เซอร์
  • ดึงภาพ
  • ดึงคลิปเสียง
  • เล่นคลิปเสียง
  • ปรับขนาดแอพเพล็ต

นอกจากนี้คลาส Applet ยังมีอินเทอร์เฟซที่วิวเวอร์หรือเบราว์เซอร์รับข้อมูลเกี่ยวกับแอพเพล็ตและควบคุมการทำงานของแอพเพล็ต ผู้ชมอาจ -

  • ขอข้อมูลเกี่ยวกับผู้แต่งเวอร์ชันและลิขสิทธิ์ของแอพเพล็ต
  • ขอคำอธิบายพารามิเตอร์ที่แอพเพล็ตรู้จัก
  • เริ่มต้นแอพเพล็ต
  • ทำลายแอพเพล็ต
  • เริ่มการทำงานของแอพเพล็ต
  • หยุดการทำงานของแอพเพล็ต

คลาส Applet จัดเตรียมการใช้งานดีฟอลต์ของแต่ละวิธีการเหล่านี้ การใช้งานเหล่านั้นอาจถูกลบล้างได้ตามความจำเป็น

แอพเพล็ต "Hello, World" เสร็จสมบูรณ์ตามที่ระบุ วิธีเดียวที่ถูกแทนที่คือวิธีการทาสี

การเรียกใช้แอพเพล็ต

แอพเพล็ตอาจถูกเรียกใช้โดยการฝังคำสั่งในไฟล์ HTML และดูไฟล์ผ่านแอปเพล็ตวิวเวอร์หรือเบราว์เซอร์ที่เปิดใช้งาน Java

แท็ก <applet> เป็นพื้นฐานสำหรับการฝังแอพเพล็ตในไฟล์ HTML ต่อไปนี้เป็นตัวอย่างที่เรียกใช้แอพเพล็ต "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- คุณสามารถอ้างถึงHTML Applet Tagเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับการเรียกแอพเพล็ตจาก HTML

จำเป็นต้องมีโค้ดแอตทริบิวต์ของแท็ก <applet> ระบุคลาส Applet ที่จะรัน ต้องใช้ความกว้างและความสูงเพื่อระบุขนาดเริ่มต้นของพาเนลที่แอพเพล็ตทำงาน ต้องปิดคำสั่งแอพเพล็ตด้วยแท็ก </applet>

หากแอพเพล็ตรับพารามิเตอร์อาจมีการส่งผ่านค่าสำหรับพารามิเตอร์โดยการเพิ่มแท็ก <param> ระหว่าง <applet> และ </applet> เบราว์เซอร์จะละเว้นข้อความและแท็กอื่น ๆ ระหว่างแท็กแอพเพล็ต

เบราว์เซอร์ที่ไม่เปิดใช้งาน Java จะไม่ประมวลผล <applet> และ </applet> ดังนั้นสิ่งที่ปรากฏระหว่างแท็กที่ไม่เกี่ยวข้องกับแอพเพล็ตจะปรากฏให้เห็นในเบราว์เซอร์ที่ไม่ได้เปิดใช้งาน Java

วิวเวอร์หรือเบราว์เซอร์มองหาโค้ด Java ที่คอมไพล์แล้วที่ตำแหน่งของเอกสาร หากต้องการระบุเป็นอย่างอื่นให้ใช้แอตทริบิวต์ codebase ของแท็ก <applet> ดังที่แสดง -

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

หากแอพเพล็ตอยู่ในแพ็กเกจอื่นที่ไม่ใช่ค่าดีฟอลต์แพ็กเกจการถือจะต้องถูกระบุในโค้ดแอ็ตทริบิวต์โดยใช้อักขระจุด (.) เพื่อแยกส่วนประกอบแพ็กเกจ / คลาส ตัวอย่างเช่น -

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

รับพารามิเตอร์ Applet

ตัวอย่างต่อไปนี้สาธิตวิธีทำให้แอพเพล็ตตอบสนองต่อพารามิเตอร์การตั้งค่าที่ระบุในเอกสาร แอพเพล็ตนี้แสดงรูปแบบกระดานหมากรุกสีดำและสีที่สอง

สีที่สองและขนาดของแต่ละตารางอาจถูกระบุเป็นพารามิเตอร์ของแอพเพล็ตภายในเอกสาร

CheckerApplet รับพารามิเตอร์ในเมธอด init () นอกจากนี้ยังอาจได้รับพารามิเตอร์ในวิธีการ paint () อย่างไรก็ตามการรับค่าและบันทึกการตั้งค่าหนึ่งครั้งในตอนเริ่มต้นของแอพเพล็ตแทนที่จะเป็นการรีเฟรชทุกครั้งจะสะดวกและมีประสิทธิภาพ

โปรแกรมดูแอพเพล็ตหรือเบราว์เซอร์เรียกใช้เมธอด init () ของแต่ละแอพเพล็ตที่รัน ผู้ชมเรียกใช้ 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) {}
}

นี่คือวิธีการ init () และ parseSquareSize () ของ 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
   }
}

แอพเพล็ตเรียก parseSquareSize () เพื่อแยกวิเคราะห์พารามิเตอร์ squareSize parseSquareSize () เรียกไลบรารีเมธอด Integer.parseInt () ซึ่งจะแยกวิเคราะห์สตริงและส่งกลับจำนวนเต็ม Integer.parseInt () แสดงข้อยกเว้นเมื่อใดก็ตามที่อาร์กิวเมนต์ไม่ถูกต้อง

ดังนั้น parseSquareSize () จึงจับข้อยกเว้นแทนที่จะปล่อยให้แอพเพล็ตล้มเหลวในการป้อนข้อมูลที่ไม่ถูกต้อง

แอพเพล็ตเรียก parseColor () เพื่อแยกวิเคราะห์พารามิเตอร์สีเป็นค่าสี parseColor () ทำการเปรียบเทียบชุดสตริงเพื่อจับคู่ค่าพารามิเตอร์กับชื่อของสีที่กำหนดไว้ล่วงหน้า คุณต้องใช้วิธีการเหล่านี้เพื่อให้แอพเพล็ตนี้ทำงานได้

การระบุพารามิเตอร์แอปเพล็ต

ต่อไปนี้เป็นตัวอย่างของไฟล์ HTML ที่มี CheckerApplet ฝังอยู่ ไฟล์ HTML ระบุพารามิเตอร์ทั้งสองให้กับแอพเพล็ตโดยใช้แท็ก <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 - ชื่อพารามิเตอร์ไม่คำนึงถึงขนาดตัวพิมพ์

การแปลงแอปพลิเคชันเป็นแอพเพล็ต

การแปลงแอปพลิเคชัน Java แบบกราฟิกเป็นเรื่องง่าย (นั่นคือแอปพลิเคชันที่ใช้ AWT และคุณสามารถเริ่มต้นด้วยตัวเรียกใช้โปรแกรม Java) เป็นแอพเพล็ตที่คุณสามารถฝังในเว็บเพจได้

ต่อไปนี้เป็นขั้นตอนเฉพาะสำหรับการแปลงแอปพลิเคชันเป็นแอพเพล็ต

  • สร้างหน้า HTML ด้วยแท็กที่เหมาะสมเพื่อโหลดโค้ดแอพเพล็ต

  • จัดหาคลาสย่อยของคลาส JApplet กำหนดให้ชั้นเรียนนี้เป็นแบบสาธารณะ มิฉะนั้นจะไม่สามารถโหลดแอพเพล็ตได้

  • กำจัดวิธีการหลักในแอปพลิเคชัน อย่าสร้างกรอบหน้าต่างสำหรับแอปพลิเคชัน แอปพลิเคชันของคุณจะแสดงภายในเบราว์เซอร์

  • ย้ายรหัสเริ่มต้นจากตัวสร้างหน้าต่างกรอบไปยังวิธีการเริ่มต้นของแอพเพล็ต คุณไม่จำเป็นต้องสร้างวัตถุแอพเพล็ตอย่างชัดเจน เบราว์เซอร์จะสร้างอินสแตนซ์ให้คุณและเรียกใช้เมธอด init

  • ลบการโทรเพื่อ setSize; สำหรับแอพเพล็ตการปรับขนาดทำได้ด้วยพารามิเตอร์ความกว้างและความสูงในไฟล์ HTML

  • ลบการเรียกไปที่ setDefaultCloseOperation ไม่สามารถปิดแอพเพล็ตได้ จะยุติเมื่อเบราว์เซอร์ออก

  • หากแอปพลิเคชันเรียกใช้ setTitle ให้ยกเลิกการเรียกใช้เมธอด แอพเพล็ตต้องไม่มีแถบหัวเรื่อง (แน่นอนคุณสามารถตั้งชื่อหน้าเว็บได้โดยใช้แท็กหัวเรื่อง HTML)

  • อย่าเรียก setVisible (จริง) แอพเพล็ตจะแสดงโดยอัตโนมัติ

การจัดการเหตุการณ์

แอพเพล็ตสืบทอดกลุ่มวิธีการจัดการเหตุการณ์จากคลาสคอนเทนเนอร์ คลาส Container กำหนดเมธอดต่างๆเช่น processKeyEvent และ processMouseEvent สำหรับจัดการเหตุการณ์บางประเภทจากนั้นก็ใช้วิธี catch-all หนึ่งวิธีที่เรียกว่า processEvent

ในการตอบสนองต่อเหตุการณ์แอพเพล็ตจะต้องแทนที่วิธีการเฉพาะเหตุการณ์ที่เหมาะสม

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

ตอนนี้ให้เราเรียกแอพเพล็ตนี้ดังนี้ -

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

เริ่มแรกแอพเพล็ตจะแสดง "initializing the applet. start the applet." จากนั้นเมื่อคุณคลิกภายในสี่เหลี่ยมผืนผ้า "คลิกเมาส์" จะปรากฏขึ้นเช่นกัน

การแสดงภาพ

แอพเพล็ตสามารถแสดงภาพในรูปแบบ GIF, JPEG, BMP และอื่น ๆ ในการแสดงภาพภายในแอพเพล็ตคุณใช้เมธอด drawImage () ที่พบในคลาส java.awt.Graphics

ต่อไปนี้เป็นตัวอย่างที่แสดงขั้นตอนทั้งหมดในการแสดงภาพ -

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

ตอนนี้ให้เราเรียกแอพเพล็ตนี้ดังนี้ -

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

กำลังเล่นเสียง

แอพเพล็ตสามารถเล่นไฟล์เสียงที่แสดงโดยอินเตอร์เฟส AudioClip ในแพ็คเกจ java.applet อินเทอร์เฟซ AudioClip มีสามวิธี ได้แก่ -

  • public void play() - เล่นคลิปเสียงหนึ่งครั้งตั้งแต่เริ่มต้น

  • public void loop() - ทำให้คลิปเสียงเล่นซ้ำอย่างต่อเนื่อง

  • public void stop() - หยุดเล่นคลิปเสียง

ในการรับวัตถุ AudioClip คุณต้องเรียกใช้เมธอด getAudioClip () ของคลาส Applet เมธอด 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();
      }
   }
}

ตอนนี้ให้เราเรียกแอพเพล็ตนี้ดังนี้ -

<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 บนพีซีของคุณเพื่อทดสอบตัวอย่างข้างต้น