当前位置: 首页 > 文档资料 > 学习 Java 编程 >

Applet基础知识(Applet Basics)

优质
小牛编辑
133浏览
2023-12-01

applet是一个在Web浏览器中运行的Java程序。 applet可以是一个功能齐全的Java应用程序,因为它可以使用整个Java API。

applet和独立Java应用程序之间存在一些重要差异,包括以下内容 -

  • applet是一个扩展java.applet.Applet类的Java类。

  • 不在applet上调用main()方法,并且applet类不会定义main()。

  • Applet旨在嵌入HTML页面中。

  • 当用户查看包含applet的HTML页面时,applet的代码将下载到用户的计算机上。

  • 查看applet需要JVM。 JVM可以是Web浏览器的插件,也可以是单独的运行时环境。

  • 用户计算机上的JVM创建applet类的实例,并在applet的生命周期内调用各种方法。

  • Applet具有由Web浏览器强制执行的严格安全规则。 applet的安全性通常被称为沙箱安全性,将applet与在沙箱中玩的孩子进行比较,并遵循必须遵循的各种规则。

  • applet所需的其他类可以在单个Java Archive(JAR)文件中下载。

小程序的生命周期

Applet类中的四个方法为您提供了构建任何严重applet的框架 -

  • init - 此方法适用于applet所需的初始化。 在处理applet标记内的param标记之后调用它。

  • start - 在浏览器调用init方法后自动调用此方法。 每当用户在离开其他页面后返回包含applet的页面时,也会调用它。

  • stop - 当用户离开applet所在的页面时,将自动调用此方法。 因此,它可以在同一个小程序中重复调用。

  • destroy - 仅在浏览器正常关闭时调用此方法。 因为applet意味着生活在HTML页面上,所以在用户离开包含applet的页面后,通常不应该留下资源。

  • paint - 在start()方法之后立即调用,也是applet需要在浏览器中重新绘制的任何时候。 paint()方法实际上是从java.awt继承的。

一个“Hello,World”Applet

以下是一个名为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);
   }
}

这些import语句将类带入applet类的范围 -

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

如果没有这些import语句,Java编译器将无法识别applet类引用的类Applet和Graphics。

小程序类

每个applet都是java.applet.Applet class的扩展。 基础Applet类提供派生Applet类可以调用以从浏览器上下文获取信息和服务的方法。

这些包括执行以下操作的方法 -

  • 获取applet参数
  • 获取包含applet的HTML文件的网络位置
  • 获取applet类目录的网络位置
  • 在浏览器中打印状态消息
  • 获取图像
  • 获取音频剪辑
  • 播放音频剪辑
  • 调整小程序的大小

此外,Applet类提供了一个界面,通过该界面,查看器或浏览器可以获取有关applet的信息并控制applet的执行。 观众可以 -

  • 请求有关applet的作者,版本和版权的信息
  • 请求applet识别的参数的描述
  • Initialize the applet
  • 销毁小程序
  • 启动applet的执行
  • 停止applet的执行

Applet类提供了每种方法的默认实现。 可以根据需要覆盖这些实现。

“Hello,World”小程序已经完成。 重写的唯一方法是paint方法。

调用Applet

可以通过在HTML文件中嵌入指令并通过applet查看器或支持Java的浏览器查看文件来调用applet。

标记是将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标记以了解有关从HTML调用applet的更多信息。

标记的code属性是必需的。 它指定要运行的Applet类。 还需要宽度和高度来指定运行applet的面板的初始大小。 必须使用 applet>标记关闭applet指令。

如果applet接受参数,则可以通过在和 applet>之间添加标记来为参数传递值。 浏览器忽略applet标记之间的文本和其他标记。

不支持Java的浏览器不处理和 applet>。 因此,在非Java启用的浏览器中可以看到标记之间出现的与applet无关的任何内容。

查看器或浏览器在文档的位置查找已编译的Java代码。 要另行指定,请使用标记的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响应文档中指定的设置参数。 这个小程序显示黑色和第二种颜色的棋盘图案。

可以将第二颜色和每个正方形的大小指定为文档中的小程序的参数。

CheckerApplet在init()方法中获取其参数。 它也可以在paint()方法中获取其参数。 但是,在applet的开头获取值并保存设置,而不是每次刷新都是方便有效的。

applet查看器或浏览器调用它运行的每个applet的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) {}
}

这是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参数解析为Color值。 parseColor()执行一系列字符串比较,以将参数值与预定义颜色的名称相匹配。 您需要实现这些方法才能使此applet正常工作。

指定Applet参数

以下是嵌入了CheckerApplet的HTML文件示例。 HTML文件通过标记指定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>

Note - 参数名称不区分大小写。

应用程序转换到Applet

将图形化Java应用程序(即使用AWT并且可以从Java程序启动器开始的应用程序)转换为可以嵌入网页的applet很容易。

以下是将应用程序转换为applet的具体步骤。

  • 使用适当的标记创建一个HTML页面以加载applet代码。

  • 提供JApplet类的子类。 将此课程公之于众。 否则,无法加载applet。

  • 消除应用程序中的主要方法。 不要为应用程序构造框架窗口。 您的应用程序将显示在浏览器中。

  • 将任何初始化代码从框架窗口构造函数移动到applet的init方法。 您不需要显式构造applet对象。 浏览器为您实例化它并调用init方法。

  • 删除对setSize的调用; 对于applet,使用HTML文件中的width和height参数完成大小调整。

  • 删除对setDefaultCloseOperation的调用。 小程序无法关闭; 它会在浏览器退出时终止。

  • 如果应用程序调用setTitle,则取消对该方法的调用。 小程序不能有标题栏。 (当然,您可以使用HTML标题标记对网页本身进行标题。)

  • 不要调用setVisible(true)。 小程序会自动显示。

事件处理

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”。 然后,当您在矩形内部单击时,也会显示“鼠标单击”。

显示图像

小程序可以显示格式为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()方法。 无论URL是否解析为实际的音频文件,getAudioClip()方法都会立即返回。 在尝试播放音频剪辑之前,不会下载音频文件。

以下示例说明播放音频的所有步骤 -

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>

您可以在PC上使用test.wav来测试上面的示例。