📜  Java-Applet基础

📅  最后修改于: 2020-12-21 01:55:09             🧑  作者: Mango


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

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

  • 小应用程序是扩展java.applet.Applet类的Java类。

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

  • Applet旨在嵌入HTML页面中。

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

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

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

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

  • 小应用程序需要的其他类可以在单个Java存档(JAR)文件中下载。

小程序的生命周期

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

  • init-此方法适用于applet所需的任何初始化。在处理applet标签内的param标签之后,将调用该方法。

  • start-浏览器调用init方法后,将自动调用此方法。每当用户转到其他页面后返回包含小程序的页面时,也会调用此方法。

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

  • destroy-仅在浏览器正常关闭时才调用此方法。因为小应用程序本来应该驻留在HTML页面上,所以在用户离开包含小应用程序的页面之后,通常不应丢弃资源。

  • – start()方法后立即调用,以及任何时候小程序需要重绘自己的浏览器。 paint()方法实际上是从java.awt继承的。

“你好,世界”小程序

以下是一个名为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和Graphics类,applet类所引用的类。

小程序类

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

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

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

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

  • 请求有关小程序的作者,版本和版权的信息
  • 要求描述小程序可识别的参数
  • 初始化小程序
  • 销毁小程序
  • 开始执行小程序
  • 停止小程序的执行

Applet类提供了每个方法的默认实现。这些实现可能会在必要时被覆盖。

就目前而言,“ Hello,World”小程序已完成。唯一被覆盖的方法是绘画方法。

调用小程序

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

标记是将applet嵌入HTML文件的基础。以下是调用“ Hello,World”小程序的示例-

The Hello, World Applet
   
If your browser was Java-enabled, a "Hello, World" message would appear here.

注意-您可以参考HTML Applet标记以了解有关从HTML调用applet的更多信息。

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

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

不支持Java的浏览器不处理。因此,在未启用Java的浏览器中,标签之间出现的与小程序无关的所有内容都是可见的。

查看器或浏览器在文档位置查找已编译的Java代码。要指定其他内容,请使用标记的codebase属性,如下所示:


如果小程序位于默认软件包以外的其他软件包中,则必须在代码属性中使用句点字符(。)指定保留软件包,以分隔软件包/类组件。例如-


获取小程序参数

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

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

CheckerApplet在init()方法中获取其参数。它还可以在paint()方法中获取其参数。但是,在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
   }
}

小程序调用parseSquareSize()来解析squareSize参数。 parseSquareSize()调用库方法Integer.parseInt(),该方法将解析字符串并返回整数。每当Integer.parseInt()的参数无效时,都会引发异常。

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

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

指定小程序参数

以下是嵌入了CheckerApplet的HTML文件的示例。 HTML文件通过标记为applet指定了两个参数。

Checkerboard Applet
   

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

应用程序转换为小程序

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

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

  • 用适当的标记制作一个HTML页面以加载applet代码。

  • 提供JApplet类的子类。公开授课。否则,无法加载小程序。

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

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

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

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

  • 如果应用程序调用setTitle,则消除对该方法的调用。小程序不能有标题栏。 (当然,您可以使用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! ");
   }
}

现在,让我们将此小程序称为:

Event Handling
   

最初,小程序将显示“正在初始化小程序。正在启动小程序”。然后,一旦您在矩形内单击,也会显示“鼠标单击”。

显示影像

小程序可以显示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);
   }  
}

现在,让我们将此小程序称为:

The ImageDemo 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();
      }
   }
}

现在,让我们将此小程序称为:

The ImageDemo applet
   

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