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. JVM可以是Web浏览器的插件,也可以是单独的运行时环境.

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

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

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

Applet的生命周期

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

  • init : 此方法适用于applet所需的初始化.在applet标签内的param标签处理完毕后调用.

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

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

  • destroy : 只有在浏览器正常关闭时才会调用此方法.因为applet意图存在于HTML页面上,所以在用户离开包含applet的页面后,通常不应该留下资源.

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

一个"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语句,Java编译器将无法识别applet类引用的Applet和Graphics类.

Applet类

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

这些包括执行以下和减去的方法;

  • 获取applet参数

  • 获取包含applet的HTML文件的网络位置

  • 获取applet类目录的网络位置

  • 在浏览器中打印状态消息

  • 获取图像

  • 获取音频片段

  • 播放音频片段

  • 调整小程序大小

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

  • 请求有关applet的作者,版本和版权的信息

  • 请求小程序识别的参数说明

  • 初始化小程序

  • 销毁小程序

  • 启动applet的执行

  • 停止applet的执行

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

"Hello,World"applet已经完成.覆盖的唯一方法是paint方法.

调用Applet

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

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

< applet>的代码属性标签是必需的.它指定要运行的Applet类.还需要宽度和高度来指定运行applet的面板的初始大小.必须使用</applet>关闭applet指令标签.

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

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

查看器或浏览器在以下位置查找已编译的Java代码.该文件.要另行指定,请使用< applet>的codebase属性.标签显示和减去;

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

如果applet位于默认包以外的包中,则必须在code属性中使用句点字符(.)指定包装包以分隔包/class组件.例如 :

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

获取Applet参数

以下示例演示如何使applet响应文档中指定的设置参数.此小程序显示黑色和第二种颜色的棋盘图案.

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

CheckerApplet在init()方法中获取其参数.它也可以在paint()方法中获取其参数.但是,在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文件通过< 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>

注意 : 参数名称不区分大小写.

应用程序转换为小程序

转换图形Java应用程序(即使用的应用程序)很容易AWT,你可以从Java程序启动器开始)到一个可以嵌入网页的applet中.

以下是将应用程序转换为applet的具体步骤./p>

  • 创建一个带有相应标签的HTML页面以加载applet代码.

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

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

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

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

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

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

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

事件处理

小程序继承一组事件处理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>

最初,小程序将显示"初始化小程序.启动小程序."然后一旦你点击矩形内部,也会显示"鼠标点击".

显示图像

小程序可以显示格式的图像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>

播放音频

小程序可以播放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测试上述示例.