Java Applets: the JApplet class

Having introduced the concept of Java applets, it's time to see how the code to a skeleton applet looks. Essentially, an applet overrides the JApplet class1, providing an implementation of at least the init() method:

public class MyAppletClass extends JApplet {
  public void init() {
    try {
      SwingUtilities.invokeAndWait(new Runnable() {
        public void run() {
          addComponents();
        }
      });

      // non-GUI initialisation
    } catch (Exception ex) {
      throw new RuntimeException("Error initting");
    }
  }

  public void destroy() {
    // perform any cleanup
  }
}

The init() method is intended to be called when the applet has been loaded by the browser (or other applet container— we'll assume a web browser for the sake of argument). This is where any components can be added to the applet. Note the call to SwingUtilities.invokeAndWait(). You may not have used this method before, but maybe you've used the related call to invokeLater() which, as you'll recall, makes the given run() method be executed in the event thread. In other words, it's the construct we need to use when we modify the user interface from some thread that isn't the Swing event thread (or, put another way, when we're not being called from a Swing event handler such as actionPerformed() etc).

Well, the init() method is indeed called by some arbitrary thread, and we want to modify the user interface. But we may also want to do some other non-UI related initialisation. So in this case, the SwingUtilities.invokeAndWait() variant asks the event thread to execute the given run() method, as with its cousin invokeLater(), but then it waits for that run() method to be completed, before allowing the rest of our init() method to complete.

The destroy() method, which actually many applets will not need to implement, allows you to perform any cleanup code. If your cleanup is simply removing GUI components and disposing of normal objects, for example, the applet container will handle this automatically and you don't need to override destroy().

Adding components to the applet

Your applet is itself a Swing component. You can treat it as a plain old JPanel (with a default BorderLayout), add components to it, query its size, and override its paintComponent() method and draw directly on to its surface. Note that, as of Java 5, you can add components directly to the JApplet— you don't need to call getRootPane() as mentioned in earlier Swing/applet tutorials.

The start() and stop() methods

In addition to the init() and desotry() methods, two other important methods are called within the life cycle of an applet and which it may be useful to override: start() and stop(). The difference between these and the init()/destroy() methods is subtle, but essentially, an applet that wants to perform an animation or some other task "automatically" (i.e. without waiting for user input) on becoming visible should start and stop this activity inside start() and stop(). In principle, it is possible for an applet to be stopped and started multiple times durings its lifetime (although this doesn't appear to happen with many modern browsers— in practice, the applet is initted and started when the page is displayed, and stopped and destroyed when the page is closed).


1. Iif it doesn't use the Swing library, it can in theory override the "raw" Applet class. Doing so is probably rare nowadays.


If you enjoy this Java programming article, please share with friends and colleagues. Follow the author on Twitter for the latest news and rants.

Editorial page content written by Neil Coffey. Copyright © Javamex UK 2021. All rights reserved.