Using JOGL in a Java applet

From JogampWiki
Revision as of 01:46, 3 August 2011 by Wwalker (talk | contribs) (Applet viewer 2)
Jump to navigation Jump to search

You can use JOGL in a Java applet, which lets you run a Java program embedded in a web page. This page shows an example of how to do this. The example program just draws one triangle that fills a fixed-size frame in a web page.

Base class

We'll use the same triangle-drawing base class for this example that we did in the Java Web Start example. Copy the code to a file called OneTriangle.java.

Applet class

Now we need a simple class that extends java.applet.Applet to form the top level of our program. Copy this code to a file called OneTriangleAWTApplet.java.

package name.wadewalker.jogl2tests.onetriangle;

import java.applet.*;
import java.awt.*;

import javax.media.opengl.GLAnimatorControl;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;

import com.jogamp.opengl.util.FPSAnimator;

/**
 * A minimal applet that draws with JOGL in a browser window.
 *
 * @author Wade Walker
 */
@SuppressWarnings("serial")
public class OneTriangleAWTApplet extends Applet {

    private GLAnimatorControl glanimatorcontrol;

    public void init() {
        GLProfile.initSingleton( false );
        setLayout( new BorderLayout() );

        final GLCanvas glcanvas = new GLCanvas();
        glcanvas.addGLEventListener( new GLEventListener() {
            
            @Override
            public void reshape( GLAutoDrawable glautodrawable, int x, int y, int width, int height ) {
                OneTriangle.setup( glautodrawable.getGL().getGL2(), width, height );
            }
            
            @Override
            public void init( GLAutoDrawable glautodrawable ) {
            }
            
            @Override
            public void dispose( GLAutoDrawable glautodrawable ) {
            }
            
            @Override
            public void display( GLAutoDrawable glautodrawable ) {
                OneTriangle.render( glautodrawable.getGL().getGL2(), glautodrawable.getWidth(), glautodrawable.getHeight() );
            }
        });
    
        glcanvas.setSize( getSize() );
        add( glcanvas, BorderLayout.CENTER );
        glanimatorcontrol = new FPSAnimator( glcanvas, 30 );
    }

    public void start() {
        glanimatorcontrol.start();
    }
    
    public void stop() {
        glanimatorcontrol.stop();
    }
    
    public void destroy() {
    }
}

Applet web page

Finally, the applet needs a web page to display in. Note that this file sets the fixed size of the applet window. Copy this code to a file called OneTriangleApplet.html.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>OneTriangle Applet Test</title>
</head>
<body>

<P>
Test of OneTriangle as an applet.
</P>

<P>

<applet code="org.jdesktop.applet.util.JNLPAppletLauncher"
      width=600
      height=400
      archive="applet-launcher.jar,
               newt.all.jar,
               nativewindow.all.jar,
               jogl.all.jar,
               gluegen-rt.jar,
               onetriangle.jar">
   <param name="codebase_lookup" value="false">
   <param name="subapplet.classname" value="name.wadewalker.jogl2tests.onetriangle.OneTriangleAWTApplet">
   <param name="subapplet.displayname" value="OneTriangle Applet">
   <param name="noddraw.check" value="true">
   <param name="progressbar" value="true">
   <param name="jnlpNumExtensions" value="1">
   <param name="jnlpExtension1" value="JOGL.jnlp">
   <param name="jnlp_href" value="OneTriangleApplet.jnlp">
</applet>

</P>

<P>
The applet should be above this.
</P>

</body>
</html>

Setting up the applet directory

  • Create a directory to hold your applet.
  • Put your OneTriangleApplet.html file in that new directory.
  • Create a subdirectory name/wadewalker/jogl2tests/onetriangle inside your applet directory. Or if you changed the packages of the files above, create a subdirectory that matches your package names.
  • Put your OneTriangle.java and OneTriangleAWT.java files inside the subdirectory.
  • Copy all the JOGL JARs into the applet directory as described here.
  • Copy applet-launcher.jar into the applet directory. Currently this file is not part of the JOGL distribution. I built it from source I downloaded from Sven's repository. This launcher seems to be ignored when you launch the applet in IE, Firefox, and Chrome on Windows, but it is used when you launch in Safari or with the command-line applet launcher.

Compiling and JARing your program

You can compile and JAR the program exactly as we did for the [https://jogamp.org/wiki/index.php/Using_JOGL_in_Java_Web_Start#Compiling_and_JARing_your_program Java Web Start case.

Writing the JNLP files

New-style Java applets use two Java Network Launching Protocol (JNLP) files to find the JAR files that make up the applet. Create both JNLP files exactly as in the Java Web Start case.

Signing your JARs

All the JARs in your applet must be signed to work correctly in a web browser. Do this just as in the Java Web Start case, with one addition for the applet launcher JAR:

jarsigner -keystore testKeys applet-launcher.jar ww

Running the applet in a browser

To run the applet in a browser on Windows, right-click the OneTriangleApplet.html file and click "Open with > Internet Explorer|Chrome|Firefox|Safari". The result should look like this:

Applet OneTriangle test

Clearing the applet cache

Java caches applet JAR and JNLP files to reduce load time. Unfortunately, if you edit one of these files and re-launch, sometimes you won't see your changes because Java is still using the cached copy. To clear the cache on Windows, click Start > Control Panel > Java, then Temporary Internet Files > Settings... > Delete Files... > OK.

From the command line, you can just delete %USERPROFILE%\AppData\LocalLow\Sun\Java\Deployment\cache.

The Java applet launcher (if it's used) may also cache files. You can clear it by deleting %USERPROFILE%\.jnlp-applet.

Running the applet with the Java applet viewer

The Java JDK comes with a program called appletlauncher, which you can use to launch your applet from the command line without the use of a browser. This launcher works the way that older Java browser plugins used to work (and the way Safari's plugin still works), so it can help test compatibility.

When you launch with appletlauncher, it also uses the JNLPAppletLauncher class that we specified in OneTriangleApplet.html, which the newer Java plugins seem to ignore.

The downside of that is the JNLPAppletLauncher doesn't yet support relative paths, so you'll need to change the value of jnlpExtension1 in OneTriangleApplet.html and the vallue of codebase in JOGL.jnlp from "./" to absolute paths like "file://localhost/D:/Users/my/path/JOGL.jnlp".

Then, to fix the permissions, create a file named all.policy in your applet directory, and put this text in it:

grant {
  permission java.security.AllPermission;
};

Then finally you can launch the applet from the command line like this:

appletviewer -J-Djava.security.policy=all.policy OneTriangleApplet.html

The result should look like this: