- /*
- * @(#)JApplet.java 1.44 00/08/05
- *
- * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
- *
- * This software is the proprietary information of Sun Microsystems, Inc.
- * Use is subject to license terms.
- *
- */
- package javax.swing;
-
- import java.awt.*;
- import java.awt.event.*;
- import java.applet.Applet;
- import java.beans.PropertyChangeListener;
- import java.util.Locale;
- import java.util.Vector;
- import java.io.Serializable;
- import javax.accessibility.*;
-
- /**
- * An extended version of java.applet.Applet that adds support for
- * the JFC/Swing component architecture.
- * You can find task-oriented documentation about using <code>JApplet</code>
- * in <em>The Java Tutorial</em>,
- * in the section
- * <a
- href="http://java.sun.com/docs/books/tutorial/uiswing/components/applet.html">How to Make Applets</a>.
- * <p>
- * The JApplet class is slightly incompatible with java.applet.Applet.
- * JApplet contains a JRootPane as it's only child.
- * The <b>contentPane</b> should be the parent of any children of the JApplet.
- * This is different than java.applet.Applet, e.g. to add a child to
- * an an java.applet.Applet you'd write:
- * <pre>
- * applet.add(child);
- * </pre>
- * However using JApplet you need to add the child to the JApplet's contentPane
- * instead:
- * <pre>
- * applet.getContentPane().add(child);
- * </pre>
- * The same is true for setting LayoutManagers, removing components,
- * listing children, etc. All these methods should normally be sent to
- * the contentPane() instead of the JApplet itself. The contentPane() will
- * always be non-null. Attempting to set it to null will cause the JApplet
- * to throw an exception. The default contentPane() will have a BorderLayout
- * manager set on it.
- * <p>
- * Please see the JRootPane documentation for a complete description of
- * the contentPane, glassPane, and layeredPane properties.
- * <p>
- * For the keyboard keys used by this component in the standard Look and
- * Feel (L&F) renditions, see the
- * <a href="doc-files/Key-Index.html#JApplet">JApplet</a> key assignments.
- * <p>
- * <strong>Warning:</strong>
- * Serialized objects of this class will not be compatible with
- * future Swing releases. The current serialization support is appropriate
- * for short term storage or RMI between applications running the same
- * version of Swing. A future release of Swing will provide support for
- * long term persistence.
- *
- * @beaninfo
- * attribute: isContainer true
- * attribute: containerDelegate getContentPane
- * description: Swing's Applet subclass.
- *
- * @version 1.44 08/05/00
- * @author Arnaud Weber
- */
- public class JApplet extends Applet implements Accessible, RootPaneContainer
- {
- /**
- * @see #getRootPane
- * @see #setRootPane
- */
- protected JRootPane rootPane;
-
- /**
- * @see #isRootPaneCheckingEnabled
- * @see #setRootPaneCheckingEnabled
- */
- protected boolean rootPaneCheckingEnabled = false;
-
- /**
- * Creates a swing applet instance.
- */
- public JApplet() {
- super();
- // Check the timerQ and restart if necessary.
- TimerQueue q = TimerQueue.sharedInstance();
- if(q != null) {
- synchronized(q) {
- if(!q.running)
- q.start();
- }
- }
-
- /* Workaround for bug 4155072. The shared double buffer image
- * may hang on to a reference to this applet; unfortunately
- * Image.getGraphics() will continue to call JApplet.getForeground()
- * and getBackground() even after this applet has been destroyed.
- * So we ensure that these properties are non-null here.
- */
- setForeground(Color.black);
- setBackground(Color.white);
-
- setLayout(new BorderLayout());
- setRootPane(createRootPane());
- setRootPaneCheckingEnabled(true);
- }
-
-
- /** Called by the constructor methods to create the default rootPane. */
- protected JRootPane createRootPane() {
- return new JRootPane();
- }
-
- protected void processKeyEvent(KeyEvent e) {
- super.processKeyEvent(e);
- if(!e.isConsumed()) {
- JComponent.processKeyBindingsForAllComponents(e,this,e.getID() == KeyEvent.KEY_PRESSED);
- }
- }
-
-
- /**
- * Just calls <code>paint(g)</code>. This method was overridden to
- * prevent an unneccessary call to clear the background.
- */
- public void update(Graphics g) {
- paint(g);
- }
-
-
- /**
- * Sets the menubar for this applet.
- * @param menubar the menubar being placed in the applet
- *
- * @see #getJMenuBar
- *
- * @beaninfo
- * hidden: true
- * description: The menubar for accessing pulldown menus from this applet.
- */
- public void setJMenuBar(JMenuBar menuBar) {
- getRootPane().setMenuBar(menuBar);
- }
-
- /**
- * Returns the menubar set on this applet.
- *
- * @see #setJMenuBar
- */
- public JMenuBar getJMenuBar() {
- return getRootPane().getMenuBar();
- }
-
-
- /**
- * @return true if add and setLayout should be checked
- * @see #addImpl
- * @see #setLayout
- * @see #setRootPaneCheckingEnabled
- */
- protected boolean isRootPaneCheckingEnabled() {
- return rootPaneCheckingEnabled;
- }
-
-
- /**
- * If true then calls to add() and setLayout() will cause an exception
- * to be thrown.
- *
- * @see #addImpl
- * @see #setLayout
- * @see #isRootPaneCheckingEnabled
- */
- protected void setRootPaneCheckingEnabled(boolean enabled) {
- rootPaneCheckingEnabled = enabled;
- }
-
-
- /**
- * Create an runtime exception with a message like:
- * <pre>
- * "Do not use JApplet.add() use JApplet.getContentPane().add() instead"
- * </pre>
- */
- private Error createRootPaneException(String op) {
- String type = getClass().getName();
- return new Error(
- "Do not use " + type + "." + op + "() use "
- + type + ".getContentPane()." + op + "() instead");
- }
-
-
- /**
- * By default, children may not be added directly to a this component,
- * they must be added to its contentPane instead. For example:
- * <pre>
- * thiComponent.getContentPane().add(child)
- * </pre>
- * An attempt to add to directly to this component will cause an
- * runtime exception to be thrown. Subclasses can disable this
- * behavior.
- *
- * @see #setRootPaneCheckingEnabled
- * @exception Error if called with rootPaneChecking true
- */
- protected void addImpl(Component comp, Object constraints, int index)
- {
- if(isRootPaneCheckingEnabled()) {
- throw createRootPaneException("add");
- }
- else {
- super.addImpl(comp, constraints, index);
- }
- }
-
- /**
- * Removes the specified component from this container.
- * @param comp the component to be removed
- * @see #add
- */
- public void remove(Component comp) {
- if (comp == rootPane) {
- super.remove(comp);
- } else {
- // Client mistake, but we need to handle it to avoid a
- // common object leak in client applications.
- getContentPane().remove(comp);
- }
- }
-
-
- /**
- * By default the layout of this component may not be set,
- * the layout of its contentPane should be set instead.
- * For example:
- * <pre>
- * thiComponent.getContentPane().setLayout(new BorderLayout())
- * </pre>
- * An attempt to set the layout of this component will cause an
- * runtime exception to be thrown. Subclasses can disable this
- * behavior.
- *
- * @see #setRootPaneCheckingEnabled
- * @exception Error if called with rootPaneChecking true
- */
- public void setLayout(LayoutManager manager) {
- if(isRootPaneCheckingEnabled()) {
- throw createRootPaneException("setLayout");
- }
- else {
- super.setLayout(manager);
- }
- }
-
-
- /**
- * Returns the rootPane object for this applet.
- *
- * @see #setRootPane
- * @see RootPaneContainer#getRootPane
- */
- public JRootPane getRootPane() {
- return rootPane;
- }
-
-
- /**
- * Sets the rootPane property. This method is called by the constructor.
- * @param root the rootPane object for this applet
- *
- * @see #getRootPane
- *
- * @beaninfo
- * hidden: true
- * description: the RootPane object for this applet.
- */
- protected void setRootPane(JRootPane root) {
- if(rootPane != null) {
- remove(rootPane);
- }
- rootPane = root;
- if(rootPane != null) {
- boolean checkingEnabled = isRootPaneCheckingEnabled();
- try {
- setRootPaneCheckingEnabled(false);
- add(rootPane, BorderLayout.CENTER);
- }
- finally {
- setRootPaneCheckingEnabled(checkingEnabled);
- }
- }
- }
-
-
- /**
- * Returns the contentPane object for this applet.
- *
- * @see #setContentPane
- * @see RootPaneContainer#getContentPane
- */
- public Container getContentPane() {
- return getRootPane().getContentPane();
- }
-
- /**
- * Sets the contentPane property. This method is called by the constructor.
- * @param contentPane the contentPane object for this applet
- *
- * @exception java.awt.IllegalComponentStateException (a runtime
- * exception) if the content pane parameter is null
- * @see #getContentPane
- * @see RootPaneContainer#setContentPane
- *
- * @beaninfo
- * hidden: true
- * description: The client area of the applet where child
- * components are normally inserted.
- */
- public void setContentPane(Container contentPane) {
- getRootPane().setContentPane(contentPane);
- }
-
- /**
- * Returns the layeredPane object for this applet.
- *
- * @exception java.awt.IllegalComponentStateException (a runtime
- * exception) if the layered pane parameter is null
- * @see #setLayeredPane
- * @see RootPaneContainer#getLayeredPane
- */
- public JLayeredPane getLayeredPane() {
- return getRootPane().getLayeredPane();
- }
-
- /**
- * Sets the layeredPane property. This method is called by the constructor.
- * @param layeredPane the layeredPane object for this applet
- *
- * @see #getLayeredPane
- * @see RootPaneContainer#setLayeredPane
- *
- * @beaninfo
- * hidden: true
- * description: The pane which holds the various applet layers.
- */
- public void setLayeredPane(JLayeredPane layeredPane) {
- getRootPane().setLayeredPane(layeredPane);
- }
-
- /**
- * Returns the glassPane object for this applet.
- *
- * @see #setGlassPane
- * @see RootPaneContainer#getGlassPane
- */
- public Component getGlassPane() {
- return getRootPane().getGlassPane();
- }
-
- /**
- * Sets the glassPane property.
- * This method is called by the constructor.
- * @param glassPane the glassPane object for this applet
- *
- * @see #getGlassPane
- * @see RootPaneContainer#setGlassPane
- *
- * @beaninfo
- * hidden: true
- * description: A transparent pane used for menu rendering.
- */
- public void setGlassPane(Component glassPane) {
- getRootPane().setGlassPane(glassPane);
- }
-
-
- /**
- * Returns a string representation of this JApplet. This method
- * is intended to be used only for debugging purposes, and the
- * content and format of the returned string may vary between
- * implementations. The returned string may be empty but may not
- * be <code>null</code>.
- *
- * @return a string representation of this JApplet.
- */
- protected String paramString() {
- String rootPaneString = (rootPane != null ?
- rootPane.toString() : "");
- String rootPaneCheckingEnabledString = (rootPaneCheckingEnabled ?
- "true" : "false");
-
- return super.paramString() +
- ",rootPane=" + rootPaneString +
- ",rootPaneCheckingEnabled=" + rootPaneCheckingEnabledString;
- }
-
-
-
- /////////////////
- // Accessibility support
- ////////////////
-
- protected AccessibleContext accessibleContext = null;
-
- /**
- * Gets the AccessibleContext associated with this JApplet.
- * For JApplets, the AccessibleContext takes the form of an
- * AccessibleJApplet.
- * A new AccessibleJApplet instance is created if necessary.
- *
- * @return an AccessibleJApplet that serves as the
- * AccessibleContext of this JApplet
- */
- public AccessibleContext getAccessibleContext() {
- if (accessibleContext == null) {
- accessibleContext = new AccessibleJApplet();
- }
- return accessibleContext;
- }
-
- /**
- * This class implements accessibility support for the
- * <code>JApplet</code> class.
- */
- protected class AccessibleJApplet extends AccessibleApplet {
- // everything moved to new parent, AccessibleApplet
- }
- }
-