شنبه ۲۹ دي ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش جاوا - مفاهیم پایه Applet

یک applet برنامه‌ای است که در مرورگر وب اجرا می‌شود. یک applet می‌تواند یک برنامه جاوا کامل باشد، زیرا به تمامی رابط‌های برنامه‌نویسی جاوا دسترسی دارد.

تفاوت‌های مهمی بین یک applet و یک برنامه جاوا مستقل وجود دارد که عبارتند از:

  • یک applet یک کلاس جاوا است که از کلاس java.applet.Applet گسترش می‌یابد.

  • در یک applet، یک متد main() فراخوانی نمی‌شود و کلاس applet آن را تعریف نمی‌کند.

  • applet‌ها برای درج در صفحه HTML طراحی شده‌اند.

  • زمانی که یک کاربر یک صفحه HTML را مشاهده می‌کند که شامل یک applet است، کد applet بر روی دستگاه کاربر دانلود می‌شود.

  • برای مشاهده یک applet، یک ماشین مجازی جاوا (JVM) لازم است. JVM می‌تواند یک افزونه مرورگر وب یا یک محیط اجرایی جداگانه باشد.

  • JVM موجود بر روی دستگاه کاربر نمونه‌ای از کلاس applet ایجاد می‌کند و در طول عمر applet، از متدهای مختلفی استفاده می‌کند.

  • applet‌ها قوانین امنیتی سختی دارند که توسط مرورگر وب اعمال می‌شوند. امنیت یک applet معمولاً به عنوان امنیت محدودیتی شناخته می‌شود و بازبینی applet را با یک کودکی که در یک جعبه شنی با قوانین مختلف بازی می‌کند مقایسه می‌کند که باید دنبال قوانینی باشد.

  • کلاس‌های دیگری که applet به آن‌ها نیاز دارد می‌توانند در یک فایل Java Archive (JAR) به صورت یکپارچه دانلود شوند.

چرخه عمر یک Applet

چهار متد در کلاس Applet به شما چارچوبی را که بر روی آن یک applet ساخته می‌شود، ارائه می‌دهد:

  • init - این متد برای هر گونه مقداردهی اولیه مورد نیاز برای applet شما استفاده می‌شود. این متد پس از پردازش تگ‌های param داخل تگ applet فراخوانی می‌شود.

  • start - این متد به طور خودکار بعد از فراخوانی مرورگر متد init فراخوانی می‌شود. همچنین هر بار که کاربر به صفحه حاوی applet برگردد بعد از رفتن به صفحات دیگر نیز فراخوانی می‌شود.

  • stop - این متد به طور خودکار هنگامی که کاربر از صفحه‌ای که applet در آن قرار دارد خارج می‌شود فراخوانی می‌شود. بنابراین، ممکن است این متد به صورت تکراری در یک applet فراخوانی شود.

  • destroy - این متد تنها زمانی فراخوانی می‌شود که مرورگر به طور عادی بسته شود. زیرا applet‌ها برای زندگی در یک صفحه HTML طراحی شده‌اند، بنابراین عموماً بعد از اینکه کاربر از صفحه حاوی applet خارج شود، منابعی را پس نمی‌گذارید.

  • paint - این متد فوراً پس از متد start() فراخوانی می‌شود و همچنین هر بار که applet نیاز به ترسیم خود در مرورگر دارد. متد paint() در واقع از کلاس java.awt به ارث برده شده است.

یک Applet "Hello, World"

در زیر یک applet ساده با نام HelloWorldApplet.java نمایش داده شده است:


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

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

این دستورات import کلاس‌ها را در دامنه کلاس applet ما به ما می‌آورد −

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

بدون این دستورات import، کامپایلر جاوا نمی‌تواند کلاس‌های Applet و Graphics را که به آن‌ها در کلاس applet ارجاع داده شده است، تشخیص دهد.

کلاس Applet

هر applet یک گسترش از کلاس java.applet.Applet است. کلاس پایه Applet متدهایی را فراهم می‌کند که یک کلاس مشتق شده از کلاس Applet می‌تواند برای دریافت اطلاعات و خدمات از محیط مرورگر فراخوانی کند.

این شامل متدهایی است که عملیات زیر را انجام می‌دهند −

  • دریافت پارامترهای applet
  • دریافت مکان شبکه فایل HTML که شامل applet است
  • دریافت مکان شبکه پوشه کلاس applet
  • چاپ پیام وضعیت در مرورگر
  • دریافت تصویر
  • دریافت کلیپ صوتی
  • پخش کلیپ صوتی
  • تغییر اندازه applet

علاوه بر این، کلاس Applet یک رابط را فراهم می‌کند که مشاهده‌کننده یا مرورگر اطلاعاتی درباره applet دریافت کرده و اجرای applet را کنترل می‌کند. مشاهده‌کننده می‌تواند −

  • اطلاعاتی درباره نویسنده، نسخه و حق کپی applet درخواست کند
  • توضیحی از پارامترهایی که applet شناسایی می‌کند درخواست کند
  • applet را مقدمه کند
  • applet را حذف کند
  • اجرای applet را آغاز کند
  • اجرای applet را متوقف کند

کلاس Applet پیاده‌سازی‌های پیش‌فرضی از هر یک از این متدها را فراهم می‌کند. این پیاده‌سازی‌ها در صورت نیاز قابل جایگزینی هستند.

applet "Hello, World" به صورت کامل است. تنها متد override شده، متد paint است.

فراخوانی یک Applet

یک applet می‌تواند با قراردادن دستورات داخل فایل HTML و مشاهده فایل از طریق نمایشگر applet یا مرورگری که قابلیت جاوا را دارد، فراخوانی شود.

تگ <applet> پایه‌ای برای قراردادن یک applet در یک فایل HTML است. در زیر یک نمونه ارائه می‌شود که 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>

توجه − می‌توانید به تگ HTML Applet مراجعه کنید تا بیشتر درباره فراخوانی applet از HTML بفهمید.

ویژگی code در تگ <applet> لازم است. این ویژگی کلاس Applet را که باید اجرا شود را مشخص می‌کند. عرض و ارتفاع همچنین لازم است تا اندازه اولیه پنلی که applet در آن اجرا می‌شود مشخص شود. دستورالعمل applet باید با تگ </applet> بسته شود.

اگر یک applet پارامترها را دریافت می‌کند، مقادیر می‌توانند برای پارامترها با اضافه کردن تگ <param> بین <applet> و </applet> ارسال شوند. مرورگر متن و سایر تگ‌ها را بین تگ‌های applet نادیده می‌گیرد.

مرورگرهایی که قابلیت جاوا را پشتیبانی نمی‌کنند، تگ‌های <applet> و </applet> را پردازش نمی‌کنند. بنابراین، هر چیزی که بین تگ‌ها قرار دارد و مرتبط با applet نیست، در مرورگرهای غیر قابلیت جاوا قابل مشاهده است.

مشاهده‌کننده یا مرورگر به دنبال کد جاوا کامپایل شده در مکان سند می‌گردد. برای مشخص کردن آن، از ویژگی codebase تگ <applet> استفاده کنید که به شکل زیر نشان داده شده است −


<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 هایی که اجرا می‌شوند، متد 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) {}
}

اینجا متدهای 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() برای تجزیهٔ پارامتر color به مقدار Color فراخوانی می‌شود. 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>

توجه − نام‌های پارامتر حساس به حروف بزرگ و کوچک نیستند.

تبدیل برنامه به اپلت

تبدیل یک برنامهٔ گرافیکی جاوا (یعنی یک برنامه که از AWT استفاده می‌کند و که می‌توانید با راه‌انداز برنامه جاوا آن را شروع کنید) به یک اپلت که می‌توانید در یک صفحهٔ وب جاسازی کنید، آسان است.

مراحل خاص برای تبدیل یک برنامه به اپلت عبارتند از:

  • ایجاد یک صفحه HTML با تگ مناسب برای بارگذاری کد اپلت.

  • فراهم کردن یک زیرکلاس از کلاس JApplet. این کلاس را عمومی (public) کنید. در غیر اینصورت، اپلت قادر به بارگذاری نمی‌شود.

  • حذف متد اصلی (main method) در برنامه. پنجرهٔ فریم (frame window) برای برنامه ساخته نشود. برنامه شما در داخل مرورگر نمایش داده خواهد شد.

  • انتقال هر کد مقدماتی از سازندهٔ پنجرهٔ فریم به متد init اپلت. شما نیازی به صریح ساختن شیء اپلت ندارید. مرورگر آن را برای شما نمونه‌سازی می‌کند و متد init را فراخوانی می‌کند.

  • حذف فراخوانی setSize؛ برای اپلت‌ها، تغییر اندازه با پارامترهای width و height در فایل HTML انجام می‌شود.

  • حذف فراخوانی setDefaultCloseOperation. یک اپلت قابل بسته شدن نیست؛ آن هنگامی که مرورگر خارج شود، پایان می‌یابد.

  • در صورتی که برنامه فراخوانی می‌کند setTitle، فراخوانی این متد را حذف کنید. اپلت‌ها قادر به داشتن نوارهای عنوان نیستند. (به طور مسلم می‌توانید صفحه وب خود را با استفاده از برچسب title در HTML عنوان دهید.)

  • فراخوانی setVisible(true) را انجام ندهید. اپلت به‌طور خودکار نمایش داده می‌شود.

کنترل رویدادها

اپلت‌ها یک گروه از متدهای کنترل رویداد از کلاس Container به ارث می‌برند. کلاس Container چندین متد مانند processKeyEvent و processMouseEvent برای کنترل انواع خاصی از رویدادها تعریف می‌کند و سپس یک متد کلی به نام 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! ");
   }
}

حالا، به ما اجازه دهید این اپلت را به شکل زیر فراخوانی کنیم −

Regenerate response Send a message. Free Research Preview. ChatGPT may produce inaccurate information about people, places, or facts. ChatGPT May 24 Version شما می‌توانید این مثال را مجدداً تکرار کنید و هر بار نتیجه‌ای متفاوت دریافت خواهید کرد. Translate هر SELECT TRANSLATION هر Add your own translation


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

ابتدا، اپلت "در حال مقداردهی اولیه کردن اپلت. شروع اپلت." را نمایش می‌دهد. سپس هنگامی که درون مستطیل کلیک می‌کنید، عبارت "کلیک ماوس" نیز نمایش داده می‌شود.

نمایش تصاویر

یک اپلت می‌تواند تصاویری با فرمت 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 روی کامپیوتر خود برای تست مثال بالا استفاده کنید.