Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误与异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java APIs & 框架

Java 类引用

Java 有用资源

Java - Applet 基础



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

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

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

  • Applet不会调用main()方法,Applet类也不会定义main()

  • Applet设计为嵌入HTML页面。

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

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

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

  • Applet具有Web浏览器强制执行的严格安全规则。Applet的安全通常被称为沙箱安全,将Applet比作在沙箱中玩耍的孩子,必须遵守各种规则。

  • Applet需要的其他类可以打包在一个Java归档(JAR)文件中下载。

Java中Applet的生命周期

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

  • init - 此方法用于Applet所需的任何初始化。在处理Applet标记内的param标记后调用此方法。

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

  • stop - 当用户离开包含Applet的页面时,会自动调用此方法。因此,它可以在同一个Applet中重复调用。

  • destroy - 此方法仅在浏览器正常关闭时调用。因为Applet旨在存在于HTML页面上,所以当用户离开包含Applet的页面后,通常不应留下任何资源。

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

Java Applet生命周期的流程

Applet生命周期方法会自动调用。下图显示了Applet生命周期的流程。

Flow of Java Applet Life Cycle

一个简单的Java Applet“Hello, World”

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

这些导入语句将类引入我们的applet类的作用域。

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

如果没有这些导入语句,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>标签是将applet嵌入HTML文件的基石。以下是一个调用“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类。width和height属性也是必需的,用于指定applet运行的面板的初始大小。applet指令必须用</applet>标签关闭。

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

不支持Java的浏览器不会处理<applet>和</applet>。因此,在这些标签之间出现的与applet无关的任何内容都可以在不支持Java的浏览器中看到。

查看器或浏览器会在文档所在位置查找已编译的Java代码。要指定其他位置,请使用<applet>标签的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响应文档中指定的设置参数。此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
   }
}

applet调用parseSquareSize()来解析squareSize参数。parseSquareSize()调用库方法Integer.parseInt(),该方法解析字符串并返回整数。每当其参数无效时,Integer.parseInt()都会抛出异常。

因此,parseSquareSize()捕获异常,而不是允许applet因错误输入而失败。

applet调用parseColor()将颜色参数解析为Color值。parseColor()执行一系列字符串比较,以将参数值与预定义颜色的名称匹配。您需要实现这些方法才能使此applet工作。

指定Applet参数

以下是一个HTML文件的示例,其中嵌入了CheckerApplet。HTML文件通过<param>标签指定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>

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

应用程序转换为Applet

可以轻松地将图形化Java应用程序(即使用AWT的应用程序,可以使用Java程序启动器启动)转换为可以嵌入网页的applet。

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

  • 创建一个HTML页面,其中包含加载applet代码的相应标签。

  • 提供一个JApplet类的子类。使这个类是公共的。否则,无法加载applet。

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

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

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

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

  • 如果应用程序调用setTitle,则消除对该方法的调用。applet不能有标题栏。(当然,可以使用HTML标题标签为网页本身添加标题。)

  • 不要调用setVisible(true)。applet会自动显示。

事件处理

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”。然后,一旦您单击矩形内部,“鼠标单击”也将显示。

显示图像

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()方法。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();
      }
   }
}

现在,让我们如下调用此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>

您可以使用您电脑上的test.wav来测试上述示例。

广告