applet和应用程序

来源:互联网 发布:流量发短信软件 编辑:程序博客网 时间:2024/04/30 07:43
applet和应用程序

  在本章中,我们将介绍开发图形的applet程序和Java应用程序的基础。这当中包含一些简单的程序代码,它们显示处理Applet或应用程序关键问题的方法,并将讨论applet和java.awt软件包之间的关系。首先我们讨论applet程序,然后详细讲述应用程序,并分析它们之间的差别和联系。

2.1 Java applet

  applet是一种Java程序。它一般运行在支持Java的Web浏览器内。运行applet所需的大多数图形支持能力都内置于浏览器中。对于applet的开发者来讲,并不需要在浏览器上为运行applet创建框架。

2.1.1 使用appletviewer

  applet程序是由嵌入在Web页中的applet HTML标志符来运行的。当我们使用支持Java的Web浏览器,或JDK所附带的appletviewer来浏览该Web页时,就可以看到applet程序的运行结果。
  为了说明的一致性和简易性,我们规定本书中所有的applet都使用以下的格式:
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Appletviewer applet_name.html
  ─────────────────────────────────
    该语法中,applet_name是可以作为appletviewer的一个参数使用的最小HTML文件,下面给出的例子就是一个简单的HTML文件。
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  <title>Applet Title</title>
  <tr>
  <applet code="applet_name.class" width=width heigh=heigh >
  </applet>
  <tr>
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  在本书后面所附带的光盘中,对于包含本书中的每个applet程序,都给出了一个相应的HTML文件,这些文件都可以作为appletviewer的参数。当然,如果Web中包含调用applet程序所需要的HTML Applet标识符的话,则这些applet程序将显示在支持Java的Web浏览器中。appletviewer忽略除applet HTML标志符以外的所有东西,因此,您可以在任何包含applet标识符的HTML文件中使用它。

2.1.2 浏览器的基础结构

  当我们在支持Java的Web浏览器中运行applet程序时,该浏览器为我们提供了运行applet程序所必须的基础结构。例如,当一个含有applet的Web页被访问时,浏览器将对Web页进行初始化和启动applet程序:当我们不需要显示该Web页时,浏览器将启动相应的方法终止applet程序的运行。
  在applet程序结构中,并不需要main()语句,因为applet程序的运行是由浏览器来控制的。这一点对于初学者来讲,往往容易引起混淆,认为在applet程序结构中不能缺少main()语句。

2.1.3 java.awt.Applet类

  如图2-1所示(图略),java.applet.Applet扩展了java.awt.Panel,所有的applet又扩展了java.applet.Applet。Panel是一个AWT容器,所以它包含有一个容器管理器,该管理器在默认情况下是FlowLayout布局管理器(请参见10.5.4节“FlowLayout布局管理器”),它布置applet的构件。
  Applet是一个容器,其默认的布局管理器是FlowLayout。
  

2.1.4 关键Applet方法

  在Applet类中,为我们提供了一系列的基本方法,用来定义applet的整体行为。一般情况下,一个applet程序的运行,由下面四个方法来控制,即init()、start()、stop()和destroy()。它们在运行时,自动被Web浏览器或appletviewer调用,而不需要我们对它们进行调用。但要注意的是,在扩展Applet类时,这些方法一般被重载。
  在表2-1中,给出了关键的Applet方法及其对应的说明。

        表2-1通常使用的applet.Applet方法
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  关键Applet方法    说明
  ─────────────────────────────────
  init() 打开带有applet的文档时,调用init()方法初始化applet
  start() 打开带有applet的文档时,在init()方法之后调用start()方
       法,启动applet
  stop() 关闭带有applet的文档时,调用stop()方法。stop()总在
      destroy()方法之前被调用
  destroy() 在stop()方法后面调用。调用destroy()是为了整理曾经使用
        的资源
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  程序范例2-1中,列举的是一个简单的applet例子,在该程序范例中,我们给出了init()、start()、stop()和destroy()的使用方法。对于init()和start(),在一般情况下被覆盖。当调用start()时,它将在applet中增加一个“Starter”标签。另外注意与所有的applet程序一样,StarterApplet也扩展了java.applet.Applet类。

程序范例2-1 Starter applet程序

  import java.applet.Applet;
  import java.awt.Label;

  public class StarterApplet extends Applet {
   private Label label;

   public void init() {
    System.out.println("Applet::init()");
   }
   public void start() {
    System.out.println("Applet::start()");
    label = new Label("Starter");
    add(label);
   }
   public void stop() {
    System.out.println("Applet::stop()");
    remove(label);
   }
   public void destroy() {
    System.out.println("Applet::destroy()");
   }
  }

这个applet程序可以被如下HTML文件中的appletviewer调用运行:

  <title>Box Unit Test</title>
  <hr>
  <applet code="StarterApplet.class" width=300 height=100>
  </applet>
  <hr>

  图2-2显示的是这个applet的窗口。

  

  运行该applet程序,将得到下面的结果:
  Applet.init()
  Applet.Start()
  退出该applet程序,将得到下面的结果:
  Applet.stop()
  Applet.destroy()

2.1.5 java.awt.Component显示方法

  我们可以通过paint()、repaint()和update()三种方法,来更新java.awt.Component的显示方式。在表2-2中,对这三种方法的工作模式进行了描述。

         表2-2 通常使用的Component方法
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Component显示方法  说明
  ─────────────────────────────────
  paint()  绘制构件
  repaint() 尽可能早地调度构件的update方法调用
  update()  重画构件,默认方案为刷新屏幕并调用paint方法
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  java.awt.Component中,还提供了一些重绘制方法,这些方法的使用可以让我们在重绘前有一个延迟,或在重绘制构件中有一个子部分。在本书11.9节“显示构件”中将详细进行这方面的讲述。

2.2 Java应用程序

  Java应用程序,由命令行激活,而由Java解释器负责运行。对开发者而言,Java应用程序和Java applet相比较,主要有两个方面的差别:
  ·应用程序必须包含一个main()方法。
  ·若应用程序需要有一个窗口,则它必须扩展AWT的Frame类
  框架是显示应用程序的窗口,它和所有的容器一样,由布局管理器来确定构件的位置和尺寸。另外,人工放置对象时,必须考虑框架的空白区,详细情况请参见5.4节“applet和应用程序之间的差别”。
  除此之外,Java应用程序和Java aplet之间,还有一个值得注意的差别是:应用程序没有与applet相同的安全性约束。不可靠的applet不能改写或修改文件,而应用程序却能执行文件的输入/输出。支持Java的浏览器可以强行约束applet程序,但这种安全性限定不约束应用程序。

2.2.1 设置应用程序

  应用程序和applet一样,如果我们为应用程序提供一个运行窗口,则应用程序必须扩展Frame类,就像我们在程序范例2-2中所讲述的那样。

程序范例2-2 StarterApplication应用程序

  import java.awt.Event;
  import java.awt.Frame;
  import java.awt.event.*;
  import java.awt.Label;

  public class StarterApplication extends Frame {
   public static void main(String args[]) {
    StarterApplication app =
     new StarterApplication("Starter Application");

    app.setSize(300,100);
    app.show ();
    System.out.println("StarterApplication::main()");
   }
   public StarterApplication(String frameTitle) {
    super(frameTitle);
    add (new Label("Starter", Label.CENTER), "Center");

    addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent event) {
      dispose();
      System.exit(0);
     }
    });
   }
  }

  该范例是一个简单应用,除了说明应用程序怎样工作,没有做其他任何事情。但是,我们可以看出它在好几个方面都不同于前面的程序范例2-1。首先,在该应用程序中没有导入并扩展java.applet.Applet,而是导入并扩展java.awt.Frame。其次,在该应用程序中,执行了main()方法,和C以及C++等程序一样,所有的Java应用程序都需要有一个main(),在应用程序中,main()是第一个被调用的方法。本程序范例中的main()方法首先创建StarterApplication实例,然后调整其大小并显示它。StarterApplication类的构造器初始化StarterApplication实例。
  在程序的最后,窗口监听者被附加到框架上。当关闭窗口时,该监听者对窗口进行处理并退出应用程序。

2.2.2 显示应用程序

  图形应用程序和其他Java应用程序相同,它们是由Java解释器直接运行的。例如,对于程序范例2-2,编译好的应用程序可由下列方式调用。
  ━━━━━━━━━━━━━━━━━
  java StarterApplication
  ━━━━━━━━━━━━━━━━━
  然后由Java解释器运行该应用程序,如图2-3所示(略)。
  在该StarterApplication应用程序中,当用户在系统菜单中激活退出命令时,执行退出应用程序的WindowListener。

2.3 组合applet和应用程序代码

  我们可以用很多的方法来编写Java程序,使得编写出来的程序既可以在浏览器中运行,也可以作为一个独立的应用程序运行。把applet程序放入框架(Frame)中,就是其中的一个方法,如下面的程序范例2-3中所描述的那样。

程序范例2-3 applet和应用程序相结合的代码

  import java.applet.Applet;
  import java.awt.Event;
  import java.awt.Frame;
  import java.awt.Label;
  import java.awt.event.*;

  public class StarterCombined extends Applet {
   private Label label;

   public static void main(String args[]) {
    StarterCombinedFrame app =
     new StarterCombinedFrame("Starter Application");

    app.setSize(300,100);
    app.show ();
    System.out.println("StarterCombinedFrame::main()");
   }
   public void init() {
    System.out.println("Applet::init()");
   }
   public void start() {
    System.out.println("Applet::start()");
    label = new Label("Starter");
    add(label);
   }
   public void stop() {
    System.out.println("Applet::stop()");
    remove(label);
   }
   public void destroy() {
    System.out.println("Applet::destroy()");
   }
  }

  class StarterCombinedFrame extends Frame {
   public StarterCombinedFrame(String frameTitle) {
    super(frameTitle);

    StarterCombined applet = new StarterCombined();
    applet.start();
    add (applet, "Center");

    addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent event) {
      dispose();
      System.exit(0);
     }
    });
   }
  }

  在该范例中,Import语句引入了一个applet程序和应用程序都需要的基本类。把main()方法放入Applet类中,那么程序无论是作为一个applet程序,还是作为一个应用程序,在运行时,都可利用同样的参数,例如下面给出的命令就可作为一个应用程序运行代码。
  ━━━━━━━━━━━━━━━━━
  java StarterCombined
  ━━━━━━━━━━━━━━━━━
  使用如下HTML文件中的appletviewer可将代码作为一个applet运行。
  <title>Box Unit Test</title>
  <hr>
  <applet code="StarterCombined.class" width=300 height=100>
  </applet>
  <hr>
  如果程序作为一个applet程序运行,那么main()方法将被忽略,而是由浏览器或appletviewer调用init()和start()方法运行applet程序。
  StarterCombinedFrame提供了一个框架,使应用程序可以在其中运行。StarterCombinedFrame产生一个applet实例,它在Frame中产生并被定义在框架的中央。

2.4 小结

  applet程序和应用程序都由Java解释器运行。应用程序在运行时必须建立自己的框架,而applet程序则是在支持Java的浏览器或appletviewer提供的框架内运行。因此,应用程序必须处理窗口关闭事件,而applet的运行则同浏览器或appletviewer控制。应用程序可自由地读写文件,而不可靠的applet程序则不允许执行这些操作。

原创粉丝点击