-1

我想制作一个小程序,以便它可以用来显示扩展 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);
        }
    }
}

我遇到的问题是这在 Applet Viewer 中运行良好,但在任何其他浏览器中都不起作用(在 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
}

我已经修改了代码,以便仅在窗口或全屏模式下设置属性

4

1 回答 1

2
java.security.AccessControlException: access denied 
    (java.util.PropertyPermission sun.java2d.opengl write)

只有受信任的小程序才能设置该属性。对代码进行数字签名。

于 2012-08-03T01:54:02.250 回答