2010-02-26 12 views
16

Estoy intentando cargar una imagen para utilizarla como icono en mi aplicación. El método apropiado de acuerdo con esta tutorial es:Cargando recursos usando getClass(). GetResource()

protected ImageIcon createImageIcon(String path, String description) 
{ 
    java.net.URL imgURL = getClass().getResource(path); 
    if (imgURL != null) { 
     return new ImageIcon(imgURL, description); 
    } else { 
     System.err.println("Couldn't find file: " + path); 
     return null; 
    } 
} 

Por lo tanto, coloca la ubicación del archivo, y se pasa como parámetro a esta función. Esto no funcionó, es decir, imgURL fue nulo. Cuando traté de crear ImageIcon al pasar en la ruta explícitamente:

ImageIcon icon = new ImageIcon(path,"My Icon Image"); 

Funcionó muy bien! Entonces, la aplicación puede recoger la imagen desde una ruta explícitamente definida, pero no recogió la imagen usando getResources(). En ambos casos, el valor de la variable de ruta es el mismo. ¿Por qué no funcionaría? ¿Cómo se encuentran los recursos del cargador de clases?

Gracias.

+2

¿Estás usando un IDE? ¿El IDE está configurado para copiar recursos en cualquier lugar donde se compilen las clases? – z5h

+0

¿Dónde se encuentra la imagen relativa a la clase y a la raíz del proyecto? – willcodejavaforfood

+0

Sí, estoy usando Eclipse, y no estaba configurado para copiar recursos. Han arreglado eso. La clase se encuentra en la raíz/bin//MyClass y las imágenes se encuentran en la raíz/resources/images/myImage.gif Gracias por sus respuestas. – Luhar

Respuesta

12

Puede pedir un camino en este formato:

/package/path/to/the/resource.ext 

Incluso los bytes para la creación de las clases en la memoria se encuentran de esta manera:

my.Class -> /my/Class.class 

y getResource le dará una wich URL puede ser utilizado para recuperar un InputStream.

Pero ... Recomiendo usar directamente getClass().getResourceAsStream(...) con el mismo argumento, porque devuelve directamente el InputStream y no tiene que preocuparse por crear un objeto de URL (probablemente complejo) que tiene que saber cómo crear el Flujo de entrada.

En resumen: intente utilizar getResourceAsStream y algún constructor de ImageIcon que utilice un inputstream como argumento.

cargadores de clases

Tenga cuidado si su aplicación tiene muchos cargadores de clases. Si tienes una aplicación independiente simple (sin servidores ni cosas complejas) no debes preocuparte. No creo que sea el caso dado que ImageIcon fue capaz de encontrarlo.

Editar: ruta de clase

getResource es -como dice- MattB para cargar los recursos de la ruta de clase (de su .jar o directorio de ruta de clases). Si está empaquetando una aplicación que es bueno tener en total, por lo que podría incluir el archivo de icono dentro de la jarra de su aplicación y obtener de esta manera.

14

getClass().getResource(path) carga recursos del classpath, no de una ruta del sistema de archivos.

+0

¡lol! Supuse que tenía el classpath no el filepath. Voy a corregir mi respuesta. – helios

3

Como noobie Estaba confundido por esto hasta que di cuenta de que la llamada "ruta" es el camino relativa a la MyClass. clase archivo en el sistema de archivos y no MiClase. java archivo. Mi IDE copia los recursos (como xx.jpg, xx.xml) a un directorio local de MyClass.class. Por ejemplo, dentro de un directorio de paquete llamado "blanco/clases/PKG. La ubicación de clase-archivo puede ser diferente para diferentes IDE y dependiendo de cómo la construcción está estructurada para su aplicación. Usted debe explorar por primera vez el sistema de archivos y encontrar la ubicación de el archivo MyClass.class y la ubicación copiada del recurso asociado que está buscando extraer.A continuación, determine la ruta relativa al archivo MyClass.class y escríbalo como un valor de cadena con "puntos" y "barras".

Por ejemplo, así es como hago que un archivo app1.fxml esté disponible para mi aplicación javafx donde el "MyClass.class" relevante es implícitamente "Main.class". El archivo Main.java es donde está contenida esta línea de código de llamadas a recursos. En mi caso específico, los recursos se copian en una ubicación al mismo nivel que la carpeta del paquete adjunta. Es decir: /target/classes/pkg/Main.class y /target/classes/app1.fxml. Así que parafraseando ... la referencia relativa "../app1.fxml" es "start from Main.class, sube un nivel de directorio, ahora puedes ver el recurso".

FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(getClass().getResource("../app1.fxml")); 

Tenga en cuenta que en esta ruta relativa cadena "../app1.fxml", los dos primeros puntos de referencia del directorio contenedor Main.class y el single "" indica una extensión de archivo a seguir. Después de que estos detalles se conviertan en una segunda naturaleza, olvidará por qué fue confuso.

Cuestiones relacionadas