/* * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.applet; import java.awt.AWTPermission; import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.HeadlessException; import java.awt.Image; import java.awt.Panel; import java.awt.event.ComponentEvent; import java.io.IOException; import java.io.ObjectInputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleRole; import javax.accessibility.AccessibleState; import javax.accessibility.AccessibleStateSet; import com.sun.media.sound.JavaSoundAudioClip; /** * An applet is a small program that is intended not to be run on its own, but * rather to be embedded inside another application. *

* The {@code Applet} class must be the superclass of any applet that is to be * embedded in a Web page or viewed by the Java Applet Viewer. The * {@code Applet} class provides a standard interface between applets and their * environment. * * @author Arthur van Hoff * @author Chris Warth * @since 1.0 * @deprecated The Applet API is deprecated, no replacement. */ @Deprecated(since = "9") public class Applet extends Panel { /** * Constructs a new Applet. *

* Note: Many methods in {@code java.applet.Applet} may be invoked by the * applet only after the applet is fully constructed; applet should avoid * calling methods in {@code java.applet.Applet} in the constructor. * * @throws HeadlessException if {@code GraphicsEnvironment.isHeadless()} * returns {@code true} * @see java.awt.GraphicsEnvironment#isHeadless * @since 1.4 */ public Applet() throws HeadlessException { if (GraphicsEnvironment.isHeadless()) { throw new HeadlessException(); } } /** * Applets can be serialized but the following conventions MUST be followed: *

* Before Serialization: An applet must be in STOPPED state. *

* After Deserialization: The applet will be restored in STOPPED state (and * most clients will likely move it into RUNNING state). The stub field will * be restored by the reader. */ private transient AppletStub stub; /** * Use serialVersionUID from JDK 1.0 for interoperability. */ private static final long serialVersionUID = -5836846270535785031L; /** * Read an applet from an object input stream. * * @param s an object input stream * @throws HeadlessException if {@code GraphicsEnvironment.isHeadless()} * returns {@code true} * @serial * @see java.awt.GraphicsEnvironment#isHeadless * @since 1.4 */ private void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException, HeadlessException { if (GraphicsEnvironment.isHeadless()) { throw new HeadlessException(); } s.defaultReadObject(); } /** * Sets this applet's stub. This is done automatically by the system. *

* If there is a security manager, its {@code checkPermission} method is * called with the {@code AWTPermission("setAppletStub")} permission if a * stub has already been set. * * @param stub the new stub * @throws SecurityException if the caller cannot set the stub */ public final void setStub(AppletStub stub) { if (this.stub != null) { SecurityManager s = System.getSecurityManager(); if (s != null) { s.checkPermission(new AWTPermission("setAppletStub")); } } this.stub = stub; } /** * Determines if this applet is active. An applet is marked active just * before its {@code start} method is called. It becomes inactive just * before its {@code stop} method is called. * * @return {@code true} if the applet is active; {@code false} otherwise * @see java.applet.Applet#start() * @see java.applet.Applet#stop() */ public boolean isActive() { if (stub != null) { return stub.isActive(); } else { // If stub field not filled in, applet never active return false; } } /** * Gets the {@code URL} of the document in which this applet is embedded. * For example, suppose an applet is contained within the document: *

     *    http://www.oracle.com/technetwork/java/index.html
     * 
* The document base is: *
     *    http://www.oracle.com/technetwork/java/index.html
     * 
* * @return the {@link java.net.URL} of the document that contains this * applet * @see java.applet.Applet#getCodeBase() */ public URL getDocumentBase() { return stub.getDocumentBase(); } /** * Gets the base {@code URL}. This is the {@code URL} of the directory which * contains this applet. * * @return the base {@link java.net.URL} of the directory which contains * this applet * @see java.applet.Applet#getDocumentBase() */ public URL getCodeBase() { return stub.getCodeBase(); } /** * Returns the value of the named parameter in the HTML tag. For example, if * this applet is specified as *
     * <applet code="Clock" width=50 height=50>
     * <param name=Color value="blue">
     * </applet>
     * 
*

* then a call to {@code getParameter("Color")} returns the value * {@code "blue"}. *

* The {@code name} argument is case insensitive. * * @param name a parameter name * @return the value of the named parameter, or {@code null} if not set */ public String getParameter(String name) { return stub.getParameter(name); } /** * Determines this applet's context, which allows the applet to query and * affect the environment in which it runs. *

* This environment of an applet represents the document that contains the * applet. * * @return the applet's context */ public AppletContext getAppletContext() { return stub.getAppletContext(); } /** * Requests that this applet be resized. * * @param width the new requested width for the applet * @param height the new requested height for the applet */ @SuppressWarnings("deprecation") public void resize(int width, int height) { Dimension d = size(); if ((d.width != width) || (d.height != height)) { super.resize(width, height); if (stub != null) { stub.appletResize(width, height); } } } /** * Requests that this applet be resized. * * @param d an object giving the new width and height */ @SuppressWarnings("deprecation") public void resize(Dimension d) { resize(d.width, d.height); } /** * Indicates if this container is a validate root. *

* {@code Applet} objects are the validate roots, and, therefore, they * override this method to return {@code true}. * * @return {@code true} * @see java.awt.Container#isValidateRoot * @since 1.7 */ @Override public boolean isValidateRoot() { return true; } /** * Requests that the argument string be displayed in the "status window". * Many browsers and applet viewers provide such a window, where the * application can inform users of its current state. * * @param msg a string to display in the status window */ public void showStatus(String msg) { getAppletContext().showStatus(msg); } /** * Returns an {@code Image} object that can then be painted on the screen. * The {@code url} that is passed as an argument must specify an absolute * {@code URL}. *

* This method always returns immediately, whether or not the image exists. * When this applet attempts to draw the image on the screen, the data will * be loaded. The graphics primitives that draw the image will incrementally * paint on the screen. * * @param url an absolute {@code URL} giving the location of the image * @return the image at the specified {@code URL} * @see java.awt.Image */ public Image getImage(URL url) { return getAppletContext().getImage(url); } /** * Returns an {@code Image} object that can then be painted on the screen. * The {@code url} argument must specify an absolute {@code URL}. The * {@code name} argument is a specifier that is relative to the {@code url} * argument. *

* This method always returns immediately, whether or not the image exists. * When this applet attempts to draw the image on the screen, the data will * be loaded. The graphics primitives that draw the image will incrementally * paint on the screen. * * @param url an absolute URL giving the base location of the image * @param name the location of the image, relative to the {@code url} * argument * @return the image at the specified {@code URL} * @see java.awt.Image */ public Image getImage(URL url, String name) { try { return getImage(new URL(url, name)); } catch (MalformedURLException e) { return null; } } /** * Get an audio clip from the given {@code URL}. * * @param url points to the audio clip * @return the audio clip at the specified {@code URL} * @since 1.2 */ public static final AudioClip newAudioClip(URL url) { return JavaSoundAudioClip.create(url); } /** * Returns the {@code AudioClip} object specified by the {@code URL} * argument. *

* This method always returns immediately, whether or not the audio clip * exists. When this applet attempts to play the audio clip, the data will * be loaded. * * @param url an absolute {@code URL} giving the location of the audio clip * @return the audio clip at the specified {@code URL} * @see java.applet.AudioClip */ public AudioClip getAudioClip(URL url) { return getAppletContext().getAudioClip(url); } /** * Returns the {@code AudioClip} object specified by the {@code URL} and * {@code name} arguments. *

* This method always returns immediately, whether or not the audio clip * exists. When this applet attempts to play the audio clip, the data will * be loaded. * * @param url an absolute {@code URL} giving the base location of the audio * clip * @param name the location of the audio clip, relative to the {@code url} * argument * @return the audio clip at the specified {@code URL} * @see java.applet.AudioClip */ public AudioClip getAudioClip(URL url, String name) { try { return getAudioClip(new URL(url, name)); } catch (MalformedURLException e) { return null; } } /** * Returns information about this applet. An applet should override this * method to return a {@code String} containing information about the * author, version, and copyright of the applet. *

* The implementation of this method provided by the {@code Applet} class * returns {@code null}. * * @return a string containing information about the author, version, and * copyright of the applet */ public String getAppletInfo() { return null; } /** * Gets the locale of the applet. It allows the applet to maintain its own * locale separated from the locale of the browser or appletviewer. * * @return the locale of the applet; if no locale has been set, the default * locale is returned * @since 1.1 */ public Locale getLocale() { Locale locale = super.getLocale(); if (locale == null) { return Locale.getDefault(); } return locale; } /** * Returns information about the parameters that are understood by this * applet. An applet should override this method to return an array of * {@code Strings} describing these parameters. *

* Each element of the array should be a set of three {@code Strings} * containing the name, the type, and a description. For example: *

     * String pinfo[][] = {
     *   {"fps",    "1-10",    "frames per second"},
     *   {"repeat", "boolean", "repeat image loop"},
     *   {"imgs",   "url",     "images directory"}
     * };
     * 
*

* The implementation of this method provided by the {@code Applet} class * returns {@code null}. * * @return an array describing the parameters this applet looks for */ public String[][] getParameterInfo() { return null; } /** * Plays the audio clip at the specified absolute {@code URL}. Nothing * happens if the audio clip cannot be found. * * @param url an absolute {@code URL} giving the location of the audio clip */ public void play(URL url) { AudioClip clip = getAudioClip(url); if (clip != null) { clip.play(); } } /** * Plays the audio clip given the URL and a specifier that is relative to * it. Nothing happens if the audio clip cannot be found. * * @param url an absolute {@code URL} giving the base location of the audio * clip * @param name the location of the audio clip, relative to the {@code url} * argument */ public void play(URL url, String name) { AudioClip clip = getAudioClip(url, name); if (clip != null) { clip.play(); } } /** * Called by the browser or applet viewer to inform this applet that it has * been loaded into the system. It is always called before the first time * that the {@code start} method is called. *

* A subclass of {@code Applet} should override this method if it has * initialization to perform. For example, an applet with threads would use * the {@code init} method to create the threads and the {@code destroy} * method to kill them. *

* The implementation of this method provided by the {@code Applet} class * does nothing. * * @see java.applet.Applet#destroy() * @see java.applet.Applet#start() * @see java.applet.Applet#stop() */ public void init() { } /** * Called by the browser or applet viewer to inform this applet that it * should start its execution. It is called after the {@code init} method * and each time the applet is revisited in a Web page. *

* A subclass of {@code Applet} should override this method if it has any * operation that it wants to perform each time the Web page containing it * is visited. For example, an applet with animation might want to use the * {@code start} method to resume animation, and the {@code stop} method to * suspend the animation. *

* Note: some methods, such as {@code getLocationOnScreen}, can only provide * meaningful results if the applet is showing. Because {@code isShowing} * returns {@code false} when the applet's {@code start} is first called, * methods requiring {@code isShowing} to return {@code true} should be * called from a {@code ComponentListener}. *

* The implementation of this method provided by the {@code Applet} class * does nothing. * * @see java.applet.Applet#destroy() * @see java.applet.Applet#init() * @see java.applet.Applet#stop() * @see java.awt.Component#isShowing() * @see java.awt.event.ComponentListener#componentShown(ComponentEvent) */ public void start() { } /** * Called by the browser or applet viewer to inform this applet that it * should stop its execution. It is called when the Web page that contains * this applet has been replaced by another page, and also just before the * applet is to be destroyed. *

* A subclass of {@code Applet} should override this method if it has any * operation that it wants to perform each time the Web page containing it * is no longer visible. For example, an applet with animation might want to * use the {@code start} method to resume animation, and the {@code stop} * method to suspend the animation. *

* The implementation of this method provided by the {@code Applet} class * does nothing. * * @see java.applet.Applet#destroy() * @see java.applet.Applet#init() */ public void stop() { } /** * Called by the browser or applet viewer to inform this applet that it is * being reclaimed and that it should destroy any resources that it has * allocated. The {@code stop} method will always be called before * {@code destroy}. *

* A subclass of {@code Applet} should override this method if it has any * operation that it wants to perform before it is destroyed. For example, * an applet with threads would use the {@code init} method to create the * threads and the {@code destroy} method to kill them. *

* The implementation of this method provided by the {@code Applet} class * does nothing. * * @see java.applet.Applet#init() * @see java.applet.Applet#start() * @see java.applet.Applet#stop() */ public void destroy() { } // // Accessibility support // /** * The accessible context associated with this {@code Applet}. */ AccessibleContext accessibleContext = null; /** * Gets the {@code AccessibleContext} associated with this {@code Applet}. * For applets, the {@code AccessibleContext} takes the form of an * {@code AccessibleApplet}. A new {@code AccessibleApplet} instance is * created if necessary. * * @return an {@code AccessibleApplet} that serves as the * {@code AccessibleContext} of this {@code Applet} * @since 1.3 */ public AccessibleContext getAccessibleContext() { if (accessibleContext == null) { accessibleContext = new AccessibleApplet(); } return accessibleContext; } /** * This class implements accessibility support for the {@code Applet} class. * It provides an implementation of the Java Accessibility API appropriate * to applet user-interface elements. * * @since 1.3 */ protected class AccessibleApplet extends AccessibleAWTPanel { /** * Use serialVersionUID from JDK 1.3 for interoperability. */ private static final long serialVersionUID = 8127374778187708896L; /** * Get the role of this object. * * @return an instance of {@code AccessibleRole} describing the role of * the object */ public AccessibleRole getAccessibleRole() { return AccessibleRole.FRAME; } /** * Get the state of this object. * * @return an instance of {@code AccessibleStateSet} containing the * current state set of the object * @see AccessibleState */ public AccessibleStateSet getAccessibleStateSet() { AccessibleStateSet states = super.getAccessibleStateSet(); states.add(AccessibleState.ACTIVE); return states; } } }