|
|
Start of Tutorial > Start of Trail > Start of Lesson |
Search
Feedback Form |
This section coversJApplet a class that enables applets to use Swing components.JAppletis a subclass ofjava.applet.Applet, which is covered in the Writing Applets
trail. If you've never written a regular applet before, we urge you to read that trail before proceeding with this section. The information provided in that trail applies to Swing applets, with a few exceptions that this section explains.
Any applet that contains Swing components must be implemented with a subclass of
JApplet. Here's a Swing version of one of the applets that helped make Java famous an animation applet that (in its most well known configuration) shows our mascot Duke doing cartwheels:
You can find the main source code for this applet in
Note: If you don't see the applet running above, you need to install Java Plug-in, which happens automatically when you install the J2SE JRE or SDK. We strongly recommend that you install the latest version; at least 1.3.1 is required for all our applets. You can find more information in the Java Plug-in home page.TumbleItem.java. See the examples index for links to all the files required by this example.
This section discusses the following topics:
BecauseJAppletis a top-level Swing container, each Swing applet has a root pane. The most noticeable effects of the root pane's presence are support for adding a menu bar and the need to use a content pane.As described in Using Top-Level Containers, each top-level container such as a
JApplethas a single content pane. The content pane makes Swing applets different from regular applets in the following ways:
- You add components to a Swing applet's content pane, not directly to the applet. Adding Components to the Content Pane shows you how.
- You set the layout manager on a Swing applet's content pane, not directly on the applet.
- The default layout manager for a Swing applet's content pane is
BorderLayout. This differs from the default layout manager forApplet, which isFlowLayout.- You should not put painting code directly in a
JAppletobject. See Performing Custom Paintingfor examples of how to perform custom painting in applets.
Swing components should be created, queried, and manipulated on the event-dispatching thread, but browsers don't invoke applet "milestone" methods from that thread. For this reason, the milestone methods init,start,stop, anddestroy should use theSwingUtilitiesmethodinvokeAndWait(or, if appropriate,invokeLater) so that code that refers to the Swing components is executed on the event-dispatching thread. More information about these methods and the event-dispatching thread is in How to Use Threads.
Here is an example of an
initmethod:public void init() { //Execute a job on the event-dispatching thread: //creating this applet's GUI. try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't successfully complete"); } } private void createGUI() { JLabel label = new JLabel( "You are successfully running a Swing applet!"); label.setHorizontalAlignment(JLabel.CENTER); label.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black)); getContentPane().add(label, BorderLayout.CENTER); }The
invokeLatermethod is not appropriate for this implementation because it allowsinitto return before initialization is complete, which can cause applet problems that are difficult to debug.The
initmethod inTumbleItemis more complex, as the following code shows. Like the first example, thisinitmethod implementation usesSwingUtilities.invokeAndWaitto execute the GUI creation code on the event-dispatching thread. Thisinitmethod also sets up two background threads to perform GUI-related tasks. First, it uses a Swing timer(which uses a shared thread) to fire action events whenever the animation needs to be updated. Second, it uses a
SwingWorkerobjectto create a background thread that loads the animation image files, letting the applet present a GUI before all its resources are available.
private void createGUI() { ... animator = new Animator(); animator.setOpaque(true); animator.setBackground(Color.white); setContentPane(animator); ... } public void init() { loadAppletParameters(); try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't successfully complete"); } //Set up the timer that will perform the animation. timer = new javax.swing.Timer(speed, this); timer.setInitialDelay(pause); timer.setCoalesce(false); timer.start(); //Start the animation. //Loading the images can take quite a while, so to //avoid staying in init() (and thus not being able //to show the "Loading Images..." label) we'll //load the images in a SwingWorker thread. imgs = new ImageIcon[nimgs]; final SwingWorker worker = new SwingWorker() { public Object construct() { ...//Load all the images... finishedLoading = true; return imgs; } //Executes in the event-dispatching thread. public void finished() { //Remove the "Loading images" label. animator.removeAll(); loopslot = -1; animator.repaint(); } }; worker.start(); }You can find the applet's source code in
TumbleItem.java. To find all the files required for the applet, including a link to a JNLP file that lets you run it using Java Web Start, see the example index.
TheAppletclass provides thegetImagemethod for loading images into an applet. ThegetImagemethod creates and returns anImageobject that represents the loaded image. Because Swing components useIcons rather thanImages to refer to pictures, Swing applets tend not to usegetImage. Instead Swing applets create instances ofImageIcon an icon loaded from an image file.ImageIconcomes with a code-saving benefit: it handles image tracking automatically. Refer to How to Use Iconsfor more information.
The animation of Duke doing cartwheels requires 17 different pictures. The applet uses one
ImageIconper picture and loads them in itsinitmethod. Because images can take a long time to load, the icons are loaded in a separate thread implemented by aSwingWorkerobject. Here's the code:
Thepublic void init() { ... imgs = new ImageIcon[nimgs]; ... final SwingWorker worker = new SwingWorker() { public Object construct() { //Images are numbered 1 to nimgs, //but fill array from 0 to nimgs-1. for (int i = 0; i < nimgs; i++) { imgs[i] = loadImage(i+1); } finishedLoading = true; return imgs; } ... }; worker.start(); } ... protected ImageIcon loadImage(int imageNum) { String path = dir + "/T" + imageNum + ".gif"; int MAX_IMAGE_SIZE = 2400; //Change this to the size of //your biggest image, in bytes. int count = 0; BufferedInputStream imgStream = new BufferedInputStream( this.getClass().getResourceAsStream(path)); if (imgStream != null) { byte buf[] = new byte[MAX_IMAGE_SIZE]; try { count = imgStream.read(buf); imgStream.close(); } catch (java.io.IOException ioe) { System.err.println("Couldn't read stream from file: " + path); return null; } if (count <= 0) { System.err.println("Empty file: " + path); return null; } return new ImageIcon(Toolkit.getDefaultToolkit().createImage(buf)); } else { System.err.println("Couldn't find file: " + path); return null; } }loadImagemethod loads the image for the specified frame of animation. It uses thegetResourceAsStreammethod rather than the usualgetResourcemethod to get the images. The resulting code isn't pretty, butgetResourceAsStreamis more efficient thangetResourcefor loading images from JAR files into applets that are executed using Java Plug-inTM software. Moreover, for pre-1.4 versions of Java Plug-in,getResourcecan't be used to load resources from JAR files. For further details, see Loading Images Into Applets.
The recommended way to include an applet in an HTML page is using the APPLET tag. Here's the APPLET tag for the cartwheeling Duke applet:<applet code="TumbleItem.class" codebase="example-1dot4/" archive="tumbleClasses.jar tumbleImages.jar" width="600" height="95"> <param name="maxwidth" value="120"> <param name="nimgs" value="17"> <param name="offset" value="-57"> <param name="img" value="images/tumble"> Your browser is completely ignoring the <APPLET> tag! </applet>To find out about the various <APPLET> tag parameters, refer to Test Driving an Applet
Version note: Before version 1.3.1_01a, Java Plug-in required the OBJECT or EMBED tag instead of the APPLET tag. Details are available through the Java Plug-in home page.
and Using the APPLET Tag
.
The next table lists the interesting methods thatJAppletadds to the applet API. They give you access to features provided by the root pane. Other methods you might use are defined by theComponentand
Appletclasses. See Component Methods for a list of commonly used
Componentmethods, and Taking Advantage of the Applet APIfor help in using
Appletmethods.
Method Purpose void setContentPane(Container)
Container getContentPane()Set or get the applet's content pane. The content pane contains the applet's visible GUI components and should be opaque. JRootPane createRootPane()
void setRootPane(JRootPane)
JRootPane getRootPane()Create, set, or get the applet's root pane. The root pane manages the interior of the applet including the content pane, the glass pane, and so on. void setJMenuBar(JMenuBar)
JMenuBar getJMenuBar()Set or get the applet's menu bar to manage a set of menus for the applet. void setGlassPane(Component)
Component getGlassPane()Set or get the applet's glass pane. You can use the glass pane to intercept mouse events. void setLayeredPane(JLayeredPane)
JLayeredPane getLayeredPane()Set or get the applet's layered pane. You can use the applet's layered pane to put components on top of or behind other components.
This table shows examples of Swing applets and where those examples are described.
Example Where Described Notes TumbleItemThis page An animation applet IconDemoAppletHow to Use Icons An applet for showing photos.
|
|
Start of Tutorial > Start of Trail > Start of Lesson |
Search
Feedback Form |
Copyright 1995-2004 Sun Microsystems, Inc. All rights reserved.