2011-05-30 23 views
5

Tengo una clase Applet, y quiero hacer que se ejecute como una aplicación, por lo que se dirigió al siguiente código:¿cómo puedo ejecutar un applet como aplicación?

public static void main(String args[]) { 
JFrame app = new JFrame("Applet Container"); 
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
app.setSize(200, 100); 
Hangman applet = new Hangman(); 
applet.init(); 
app.setLayout(new BorderLayout()); 
app.setSize(500,500); 
app.getContentPane().add(applet, BorderLayout.CENTER); 
app.setVisible(true); 
} 

Nota: El ahorcado es la clase applet. Y si lo ejecuto, funciona bien, pero lo que estoy tratando de hacer es hacerlo funcionar como una aplicación.

Cuando ejecuto el principal por encima, tengo el siguiente error:

Exception in thread "main" java.lang.NullPointerException 
at java.applet.Applet.getCodeBase(Applet.java:152) 
at Me.Hangman.init(Hangman.java:138) 
at Me.Client.main(Client.java:54) 
Java Result: 1 

Este error se vinieron de esta línea en la clase ahorcado:

danceMusic = getAudioClip(getCodeBase(), "../../audio/dance.au"); 

getCodeBase() devuelve nulo, Necesito ayuda sobre cómo puedo hacer que este método funcione correctamente, o tal vez reemplazarlo con otro método que pueda acceder a mis archivos para obtener recursos.

gracias de antemano

Respuesta

1

Los applets tienen un entorno de tiempo de ejecución especial. Si desea que su código se ejecute también como una aplicación, entonces no puede confiar en CUALQUIER funcionalidad proporcionada por ese entorno.

Obviamente está utilizando una función específica de Applet aquí. Debe buscar cómo hacer esto en una aplicación, luego detectar el entorno en el que se está ejecutando y utilizar los métodos apropiados.

Editar:

En lugar de getCodeBase() me gustaría probar:

getClass().getProtectionDomain().getCodeSource().getLocation(); 

Pero getAudioClip también se define en un applet, por lo que es un no-ir también. En lugar de java.applet.AudioClip, debe usar la API javax.sound.sampled.

+0

en primer lugar quiero darle las gracias, pero ¿podría por favor me conducir a encontrar una forma adecuada para cargar imágenes y audioclips sin usar url "getCodeBase" en el applet? – Mostafa

+0

Por favor, mira mi edición. – vbence

0

Estoy teniendo un problema similar y se me ocurrió lo siguiente, que funciona muy bien para los parámetros, codeBase y getImage: todavía estoy buscando la parte getAudioClip() ... sería genial si hubiera algo como ImageIo para el audio ....

// simulate Applet environment 
Map<String, String> params = new HashMap<String, String>(); 
URL documentBase; 

/** 
* set the parameter with the given name 
* 
* @param name 
* @param value 
*/ 
public void setParameter(String name, String value) { 
    params.put(name.toUpperCase(), value); 
} 

@Override 
public String getParameter(String name) { 
    String result = null; 
    if (params.containsKey(name)) 
     result = params.get(name); 
    else { 
     try { 
      result = super.getParameter(name); 
     } catch (java.lang.NullPointerException npe) { 
      throw new IllegalArgumentException("parameter " + name + " not set"); 
     } 
    } 
    return result; 
} 

/** 
* @param documentBase 
*   the documentBase to set 
* @throws MalformedURLException 
*/ 
public void setDocumentBase(String documentBase) throws MalformedURLException { 
    this.documentBase = new URL(documentBase); 
} 

@Override 
public URL getDocumentBase() { 
    URL result = documentBase; 
    if (result == null) 
     result = super.getDocumentBase(); 
    return result; 
} 

@Override 
public Image getImage(URL url) { 
    Image result = null; 
    if (this.documentBase != null) { 
     try { 
      result = ImageIO.read(url); 
     } catch (IOException e) { 
     } 
    } else { 
     result = super.getImage(url); 
    } 
    return result; 
} 
Cuestiones relacionadas