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