JPanelを拡張したゲームを表示するアプレットを作りたいです。このクラスはライブラリの一部になります。なのでクラス名はわかりません。動的にロードする必要がありました。これが私の現在の実装です。
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);
}
}
}
私が抱えている問題は、これがアプレット ビューアーではうまく機能するが、他のブラウザーでは機能しないことです (Firefox、Opera、Epiphany、Internet Explorer、Chrome でテスト済み)。エラーはそれが言うことApplet not initialized
です。
コンソールの出力
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)
アップデート
プラグインを更新することでそれを取り除くことができました。これが新しいログです。
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)
解決済み
これは私が変更したものであり、解決しました
try {
System.setProperty("sun.java2d.opengl", "true");
} catch (Exception e) {
// System doesn't support opengl
}
ウィンドウ モードまたはフルスクリーン モードでのみプロパティを設定するようにコードを変更しました。