Home : Course Map : Chapter 12 : Java :
AppletContext & Building a
Custom AppletViewer
JavaTech
Course Map
Chapter 12

Printing
  Demo 1
Cursor Icons
  Demo 2
MouseButtons
  Demo 3
PopupMenu
  Demo 4
Keystrokes
  Demo 5
Audio
  Demo 6
Timing & Speed
  Demo 7
Toolkit
  Demo 8
AppletContext
  Demo 9
Exercises

    Supplements
Java Beans
More APIs
Java & Browsers
  Demo 1
     About JavaTech
     Codes List
     Exercises
     Feedback
     References
     Resources
     Tips
     Topic Index
     Course Guide
     What's New

Applets can obtain additional services from an AppletContext object, which returns from the method

   getAppletContext ()

in the java.awt.Applet class. The methods of the AppletContext interface include:

  • getApplets () - returns an enumeration of references to other applets running on same html page.

  • getApplet (String name) - returns a reference to the applet called name used in the Name attribute in the applet tag.

  • showDocument (URL url)
    showDocument (URL url, String target)
    - loads the web page linked to the url. In the first case the applet page will be replaced. In the second case, target can be

    • "_self"      - show in current frame
    • "_parent"  - show in parent container
    • "_top"        - show in topmost frame
    • "_blank"    - show in a new, top-level window
    • "string"    - show in a frame with that string name.

  • showStatus (String msg) - show the string msg on the bottom edge status line of the browser frame.

  • getImage (URL url), getAudioClip (URL url) - return image and audioclip references, rsp.

The Applet class itself implements the AppletContext interface and provides the showStatus(), getImage() and getAudioClip() methods.

Note that the URL does not need to point just to the domain where the applet originated but can point to any web address.

The getApplet() and getApplets() methods allow for inter-applet communication when multiple applets are running on the same page.

Note that some browsers don't permit this for security reasons.

Creating Your Own AppletViewer

If you put an applet into a frame for a standalone application and the applet needs to invoke methods such as getImage(), you must implement the AppletContext and also the AppletStub interface.

This might be useful for situations where you want quickly to build a specialized application from an applet with little or no changes to the applet code.

Also, for testing network applets you could bypass the JDK appletviewer's SecurityManager restrictions.

To make a viewer you need to implement methods in these two interfaces:

  • AppletStub - methods to interface to the viewer or browser
  • AppletContext - methods that provide document information

A stub provides an intermediary between two sets of code.

This example below implements the getCodeBase() and getDocumentBase() methods in the AppletStub interface and the getImage() method in the AppletContext() method.

For the other methods it returns empty values. For applets that need these methods, you could code them appropriately.

import javax.swing.*;
import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.util.*;

/**
  *  Illustrates how a JFrame subclass can implement the
  *  AppletStub & AppletContext interfaces to build a
  *  rudimentary appletviewer.
  *
  *  Here the getDocumentBase (), getImage (URL url), and
  *  getCodeBase () were implemented in detail. You will
  *  need to implement the other methods as needed.
**/
public class StartJAppletViewer extends JFrame
   implements ActionListener, AppletStub, AppletContext
{

  /** Create a menubar for the frame and a File menu. **/
  StartJAppletViewer () {
    setTitle ("MyAppletViewer");
    JMenu m = new JMenu ("File");
    JMenuItem mi = new JMenuItem ("Quit");
    mi.addActionListener (this);
    m.add (mi);
    JMenuBar mb = new JMenuBar ();
    mb.add (m);
    setJMenuBar (mb);

  } // ctor

   // AppletStub methods

   /**
     * Use the File class  (See lecture 9) and the System properties
     * to create a URL from the current working directory.
    **/
   public URL getDocumentBase () {
     URL url = null;
     try {
       File file = new File (System.getProperty ("user.dir"));
       url = file.toURL ();
     }
     catch  (MalformedURLException e) {
       System.out.println ("Bad URL");
       url = null;
     }
     return url;
   } // getDocumentBase

   /** Provide getCodeBae that returns a URL
     * that points to the local directory where
     * this program is running.
    **/
   public URL getCodeBase () {
     URL url = null;
     try  {
       File file = new File (System.getProperty ("user.dir"));
       url = file.toURL ();
       System.out.println ("url="+url);
     }
     catch  (MalformedURLException e) {
       System.out.println ("Bad URL");
       url = null;
     }
     return url;

   } // getCodeBase

   // Note: ignore the warning that there is also a private isActive
   // method in the java.awt.Window class.
   public boolean isActive () { return true;}
   public String getParameter (String name) { return ""; }
   public AppletContext getAppletContext () { return this; }
   public void appletResize (int width, int height) {}

   // AppletContext methods

   // Use the toolkit to get the image from the local directory
   public Image getImage (URL url) {
     String imgName = url.getFile ();
     return Toolkit.getDefaultToolkit ().getImage (imgName);
   }

   public AudioClip getAudioClip (URL url) { return null; }
   public Applet getApplet (String name) { return null; }
   public Enumeration<Applet> getApplets () { return null; }
   public void showDocument (URL url) {}
   public void showDocument (URL url, String target) {}
   public void showStatus (String status) {}

   // New AppletContext methods added in vers.1.4
   public void setStream (String key, InputStream stream){}
   public Iterator<String> getStreamKeys () { return null; }
   public InputStream getStream (String key){ return null; }


   /**
     * Create the viwer and load the applet into it.
    **/
   public static void main (String [] args) {

    // Create an instance of this frame class for holding the applet
    StartJAppletViewer viewer = new StartJAppletViewer ();

    // Replace "_JApplet" with the applet of interest.
    _JApplet applet = new _JApplet ();

    applet.setStub (viewer);

    // Call init () to do whatever initialization can be
    // done outside of a browser environment.
    applet.init ();

    viewer.add ("Center", applet);

    viewer.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
    viewer.pack ();
    viewer.setSize (300,300);
    viewer.setVisible (true);

  } // main

  public void actionPerformed (ActionEvent e ) {
    if ( e.getActionCommand ().equals ("Quit") )
         dispose ();
    System.exit (0);
  } // actionPerformed

} // class StartJAppletViewer

 

For AWT cases, the StartAppletViewer.java code is available here.

If the applet doesn't need the AppletContext methods, then you can use a simpler frame starter such as StartJApp2.java (StartApp5.java for non-Swing applets)

You could go to the next step in creating an applet viewer by allowing the user to put the name of a hypertext file on the command line. You could then use the string search tools (see Chapter 10: Java : String Tools) to find the applet tags and decode them to find the applet class name, the dimensions of the applet window, and the parameters if any.

You will get the class name as a string. To then get the object that it refers to, you must take advantage of the Class class methods discussed in Chapter 5: Supplements: Class Class.

To illustrate this, we offer the program MyJAppletViewer, which expects an applet class name on the command line, e.g.

  c:\> java MyJAppletviewer HelloWorld

where HelloWorld.class applet should be in the directory with MyJAppletviewer. The main() method looks for the class name as follows:

   public static void main (String [] args) {

    if (args.length != 1) {
        System.out.println ("Applet name missing!");
        System.exit(0);
    }

    // Create an instance of this frame class for holding the applet
    MyJAppletViewer viewer = new MyJAppletViewer ();

    // Replace "_JApplet" with the applet of interest.
    JApplet applet = (JApplet)getAppletFromString (args[0]);
    if (applet == null) {
        System.out.println ("Error in finding applet class!");
        System.exit(0);
    }

    applet.setStub (viewer);
    ... same as StartJAppletViewer ...

The method getAppletFromString (args[0]) finds the class that corresponds to the string with the following code:

   /** Create Applet object from string name. **/
   static Applet getAppletFromString (String class_name) {

     Class c = null;
     try {
       c = Class.forName (class_name);
     }
     catch (ClassNotFoundException e) {
       System.out.println("ClassNotFoundException: " + e);
       return null;
     }

     Applet applet = null;

     try {
       applet = (Applet) c.newInstance();
     }
     catch (InstantiationException e) {
       System.out.println("InstantiationException: " + e);
     }
     catch (IllegalAccessException e) {
       System.out.println("IllegalAccessException: " + e);
     }
     return applet;
  }

This illustrates the power of the late binding aspect of Java. It classes to be linked dynamically at runtime rather during compilation.

References & Web Resources

 

 

Latest update: Dec. 7, 2004

              Tech
Tech APIs
Exercises

           Physics
Math/Science APIs
JAIDA Program
  Demo 1
Demo 1 Discussion
Exercises

  Part I Part II Part III
Java Core 1  2  3  4  5  6  7  8  9  10  11  12 13 14 15 16 17
18 19 20
21
22 23 24
Supplements

1  2  3  4  5  6  7  8  9  10  11  12

Tech 1  2  3  4  5  6  7  8  9  10  11  12
Physics 1  2  3  4  5  6  7  8  9  10  11  12

Java is a trademark of Sun Microsystems, Inc.