I want to make an applet so that it can be used to display a game which extends JPanel. This class will be a part of the library. So I do not know the name of the class. I had to load it dynamically. Here’s my current implementation.
package com.gej.core;
import javax.swing.JApplet;
import javax.swing.JOptionPane;
/**
* Runs a game as an Applet by loading the class dynamically at runtime. The
* name of the class should be specified as a parameter named game-class.
*
* @author Sri Harsha Chilakapati
*/
public class GApplet extends JApplet {
private static final long serialVersionUID = 1994280929713148311L;
String gmname = "";
public GApplet(String gmname) {
this.gmname = gmname;
}
public GApplet() {
gmname = "";
}
public void init(){
if (gmname == null || gmname == "") {
gmname = JOptionPane.showInputDialog("Enter game class name");
}
try {
Class<?> gameClass = getClass().getClassLoader().loadClass(gmname);
add((Game) gameClass.newInstance());
} catch (ClassNotFoundException e) {
System.err.println("Error finding class : " + gmname);
} catch (InstantiationException e) {
System.err.println("Error loading class : " + gmname);
} catch (IllegalAccessException e) {
System.err.println("Error loading class : " + gmname);
}
}
}
The problem I’m having is that this works well in the Applet Viewer but doesn’t work in any other browser (tested on Firefox, Opera, Epiphany, Internet Explorer, Chrome). The error is it says Applet not initialized.
Output of console
java version "1.6.0_23"
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2)
OpenJDK Client VM (build 20.0-b11, mixed mode, sharing)
/build/buildd/icedtea-web-1.1.3/build/../plugin/icedteanp/IcedTeaNPPlugin.cc:631: thread
0xb75368e0: Error: Unknown plugin value requested.
/build/buildd/icedtea-web-1.1.3/build/../plugin/icedteanp/IcedTeaNPPlugin.cc:631: thread
0xb75368e0: Error: Unknown plugin value requested.
java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:131)
at java.util.jar.JarFile.<init>(JarFile.java:150)
at java.util.jar.JarFile.<init>(JarFile.java:101)
at net.sourceforge.jnlp.tools.JarSigner.verifyJar(JarSigner.java:241)
at net.sourceforge.jnlp.tools.JarSigner.verifyJars(JarSigner.java:201)
at net.sourceforge.jnlp.runtime.JNLPClassLoader$4.run(JNLPClassLoader.java:1145)
at net.sourceforge.jnlp.runtime.JNLPClassLoader$4.run(JNLPClassLoader.java:1143)
at java.security.AccessController.doPrivileged(Native Method)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.addNewJar(JNLPClassLoader.java:1143)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1043)
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:712)
at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:672)
at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:884)
java.security.PrivilegedActionException: java.util.zip.ZipException: error in opening zip file
at java.security.AccessController.doPrivileged(Native Method)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.addNewJar(JNLPClassLoader.java:1143)
at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1043)
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:712)
at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:672)
at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:884)
Caused by: java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:131)
at java.util.jar.JarFile.<init>(JarFile.java:150)
at java.util.jar.JarFile.<init>(JarFile.java:101)
at net.sourceforge.jnlp.tools.JarSigner.verifyJar(JarSigner.java:241)
at net.sourceforge.jnlp.tools.JarSigner.verifyJars(JarSigner.java:201)
at net.sourceforge.jnlp.runtime.JNLPClassLoader$4.run(JNLPClassLoader.java:1145)
at net.sourceforge.jnlp.runtime.JNLPClassLoader$4.run(JNLPClassLoader.java:1143)
... 6 more
net.sourceforge.jnlp.LaunchException: Fatal: Initialization Error: Could not initialize applet.
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:728)
at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:672)
at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:884)
Caused by: java.lang.ClassNotFoundException: com.gej.GApplet
at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1089)
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:712)
... 2 more
Caused by:
java.lang.ClassNotFoundException: com.gej.GApplet
at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1089)
at net.sourceforge.jnlp.Launcher.createApplet(Launcher.java:712)
at net.sourceforge.jnlp.Launcher.getApplet(Launcher.java:672)
at net.sourceforge.jnlp.Launcher$TgThread.run(Launcher.java:884)
java.lang.NullPointerException
at net.sourceforge.jnlp.NetxPanel.runLoader(NetxPanel.java:109)
at sun.applet.AppletPanel.run(AppletPanel.java:380)
at net.sourceforge.jnlp.NetxPanel.run(NetxPanel.java:69)
at java.lang.Thread.run(Thread.java:679)
java.lang.NullPointerException
at sun.applet.AppletPanel.run(AppletPanel.java:430)
at net.sourceforge.jnlp.NetxPanel.run(NetxPanel.java:69)
at java.lang.Thread.run(Thread.java:679)
Update
I’ve managed to get rid of that by updating the plugin. Here’s the new log.
java.security.AccessControlException: access denied (java.util.PropertyPermission sun.java2d.opengl write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393)
at java.security.AccessController.checkPermission(AccessController.java:553)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at net.sourceforge.jnlp.runtime.JNLPSecurityManager.checkPermission(JNLPSecurityManager.java:284)
at java.lang.System.setProperty(System.java:744)
at com.gej.core.Game.init(Game.java:83)
at com.gej.core.Game.<init>(Game.java:69)
at com.breakout.Breakout.<init>(Breakout.java:55)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at java.lang.Class.newInstance0(Class.java:372)
at java.lang.Class.newInstance(Class.java:325)
at com.gej.core.GApplet.init(GApplet.java:38)
at sun.applet.AppletPanel.run(AppletPanel.java:436)
at net.sourceforge.jnlp.NetxPanel.run(NetxPanel.java:69)
at java.lang.Thread.run(Thread.java:679)
Solved
This is what I had changed and it solved
try {
System.setProperty("sun.java2d.opengl", "true");
} catch (Exception e) {
// System doesn't support opengl
}
I’ve modified the code so that it’ll be only setting the property in windowed or fullscreen mode only
Only a trusted applet can set the property. Digitally sign the code.