Java Applet 基础

Java Applet 基础

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

在applet和独立的Java应用程序之间有一些重要的区别,包括以下几点:

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

  • 一个applet上不会调用main()方法,也不会定义该方法。

  • applets设计成可以嵌入到HTML页面中。
  • 当用户查看包含applet的HTML页面时,applet的代码会下载到用户的计算机。
  • 查看applet需要Java虚拟机(JVM),JVM可以是Web浏览器的插件或单独的运行环境。
  • 用户机器上的JVM会创建applet类的实例,并在applet的生命周期中调用各种方法。
  • applets有严格的安全规则,由Web浏览器来执行。applet的安全性通常被称为沙箱安全,类似于孩子在沙箱中玩耍必须遵循各种规则。
  • applet所需的其他类可以通过单个Java Archive(JAR)文件下载。

Applet的生命周期

Applet类中的四个方法为您构建任何有效的applet提供了基本框架:

  • init - 此方法用于对applet进行初始化。它在applet标签中的param标签被处理后调用。
  • start - 当浏览器调用init方法后,此方法会自动调用。同时,当用户从其他页面返回包含applet的页面时,也会调用该方法。
  • stop - 当用户离开包含applet的页面时,此方法会自动调用。因此,同一个applet中可以多次调用该方法。
  • destroy - 仅当浏览器正常关闭时才会调用此方法。因为applets是作为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类

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

这些方法包括以下操作−

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

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

  • 请求有关作者、版本和版权的applet信息
  • 请求applet识别的参数的描述
  • 初始化applet
  • 销毁applet
  • 启动applet的执行
  • 停止applet的执行

applet类为每个这些方法提供了默认实现。这些实现可以根据需要进行覆盖。

“Hello, World” applet已经完成。唯一覆盖的方法是paint方法。

调用applet

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

<applet>标签是在HTML文件中嵌入applet的基础。以下是调用”Hello, World” applet的示例−

<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标签了解更多关于如何从HTML调用applet的信息。

<applet>标签的code属性是必需的。它指定要运行的Applet类。宽度和高度也是必需的,用于指定applet运行的面板的初始大小。applet指令必须用</applet>标签关闭。

如果一个applet接收参数,可以通过在<applet></applet>之间添加<param>标签来传递参数的值。浏览器会忽略在applet标签之间的文本和其他标签。

不支持Java的浏览器不处理<applet></applet>。因此,在不支持Java的浏览器中,出现在标签之间与applet无关的任何内容都是可见的。

播放器或浏览器在文档的位置查找已编译的Java代码。要指定其他位置,请使用<applet>标签的codebase属性,如下所示 –

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

如果applet位于除默认包之外的其他包中,则必须在代码属性中使用点字符(.)来分隔包/类组件,并指定所在的包。例如 −

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

获取Applet参数

以下示例演示了如何使一个applet对文档中指定的设置参数做出响应。这个applet显示了一个黑色和第二个颜色的棋盘格子模式。

第二个颜色和每个格子的大小可以作为参数指定给applet。

CheckerApplet在init()方法中获取它的参数。它也可以在paint()方法中获取参数。然而,只在applet启动时获取值和保存设置一次,而不是在每次刷新时获取,是方便和高效的。

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

这里是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
   }
}

应用程序调用parseSquareSize()方法来解析squareSize参数。parseSquareSize()方法调用了库方法Integer.parseInt(),它解析一个字符串并返回一个整数。当其参数无效时,Integer.parseInt()会抛出异常。

因此,parseSquareSize()方法捕获异常,而不允许应用程序在输入错误时失败。

应用程序调用parseColor()方法来解析color参数为Color值。parseColor()方法通过一系列字符串比较将参数值与预定义颜色的名称进行匹配。你需要实现这些方法才能使该应用程序工作。

指定应用程序参数

以下是一个包含CheckerApplet的HTML文件示例。该HTML文件通过标签指定了应用程序的两个参数。

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

注意 - 参数名区分大小写。

将应用程序转换为小程序

将Java图形应用程序(即使用AWT并且可以使用Java程序启动器启动的应用程序)转换为可以嵌入到Web页面中的小程序非常容易。

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

  • 创建一个带有适当标签以加载小程序代码的HTML页面。

  • 提供一个JApplet类的子类。将此类设为public。否则,无法加载小程序。

  • 删除应用程序中的main方法。不要构建一个用于应用程序的窗体。您的应用程序将在浏览器内显示。

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

  • 删除对setSize的调用;对于小程序,使用HTML文件中的width和height参数进行调整大小。

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

  • 如果应用程序调用setTitle,请删除该方法的调用。小程序无法拥有标题栏。(您当然可以使用HTML title标签为网页本身设置标题。)

  • 不要调用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! ");
   }
}

现在,让我们将此小程序称为如下所示 –

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

最初,小程序会显示“初始化小程序。启动小程序。”,然后当你在矩形内点击时,还会显示“鼠标点击”。

显示图像

小程序可以显示GIF、JPEG、BMP和其他格式的图像。要在小程序中显示图像,你需要使用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);
   }  
}

现在,让我们将此小程序称为以下内容:

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

播放音频

在java.applet包中,一个applet可以播放由AudioClip接口表示的音频文件。AudioClip接口包含三个方法,包括:

  • public void play() - 播放音频文件一次,从头开始。

  • public void loop() - 使音频文件连续重复播放。

  • public void stop() - 停止播放音频文件。

要获取一个AudioClip对象,你必须调用Applet类的getAudioClip()方法。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来测试上面的示例。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程