2012-08-28 13 views
7

Tengo un proyecto de Java llamado MyProject. Tengo un par de paquetes diferentes (manteniendo nombres simple para el propósito de esta pregunta), de la siguiente manera:Cargar imagen de Java dentro del paquete de una clase en un paquete diferente

src/PackageA 
src/PackageA/PackageAa 
src/PackageA/PackageAa/PackageAaa 
src/PackageB 
src/PackageB/PackageBa 
src/PackageB/PackageBa/PackageBaa 

tengo una clase

src/PackageA/PackageAa/PackageAaa/MyJavaFile.java 

Y tengo una imagen

src/PackageB/PackageBa/PackageBaa/MyImage.png 

Dentro de MyJavaFile.java, me gustaría declarar un objeto de imagen de MyImage.png

Image img = new Image(....what goes here?...) 

¿Cómo puedo hacer esto?

+1

P: ¿Por qué está poniendo un recurso .png en un paquete de Java ??? Incluso si coloca cosas en un archivo .jar, generalmente tendrá un directorio separado para los recursos ("/ resources" es un Favorito Pop). Por ejemplo: [Agregar imagen a Jar] (http://stackoverflow.com/questions/1096398/add-image-to-jar-java). PD: este enlace responde a su pregunta específica ... pero aconsejaría no hacerlo, si es posible. En mi humilde opinión ... – paulsm4

+0

paquete src/PackageB/PackageBa/PackageBaa/MyImage.png será la carpeta –

+0

Image image = Toolkit.getDefaultToolkit(). GetImage ("Agent.gif"); – TechDog

Respuesta

10

Usted podría llamar Class.getResource y especifique una ruta a partir de /, o ClassLoader.getResource y no molestar con el /:

URL resource = MyJavaFile.class 
     .getResource("/PackageB/PackageBa/PackageBaa/MyImage.png"); 

o:

URL resource = MyJavaFile.class.getClassLoader() 
     .getResource("PackageB/PackageBa/PackageBaa/MyImage.png"); 

Básicamente Class.getResource le permitirá especificar un recurso relativo a la clase, pero no piensa que le permite usar ".." etc. para la navegación de directorio.

Por supuesto, si usted sabe de una clase en el paquete adecuado, sólo puede utilizar:

URL resource = SomeClassInPackageBaa.class.getResource("MyImage.png"); 

(Asumo que puede pasar un URL a la Image constructor en cuestión También hay getResourceAsStream. en Class y ClassLoader.)

+0

¿Cómo puedo obtener una Imagen Buffered desde esta Imagen? – CodeGuy

+0

Una forma es usar 'ImageIO.read (URL)'. –

2

/folderB/folderBa/folderBaa/MyImage.png

imagen

puede almacenar en la ubicación de la carpeta de proyecto .eg: /images/MyImage.png

continuación, intenta que

Image img = new Image(/images/MyImage.png); 

Uso una ruta de archivo no es posible cuando se ejecuta un programa que está en un archivo jar, especialmente si el programa se está cargando como un applet o una aplicación WebStart, entonces puede usar ClassLoader para obtener imágenes.

utilizar el siguiente código para cargar las imágenes:

ClassLoader cldr = this.getClass().getClassLoader(); 

    java.net.URL imageURL = cldr.getResource("/PackageB/PackageBa/PackageBaa/MyImage.png"); 
ImageIcon aceOfDiamonds = new ImageIcon(imageURL); 
+0

Acepto - Crear un directorio llamado "/ images" es una práctica mucho más inteligente y mejor que almacenar su .png en una carpeta fuente/paquete Java. En mi humilde opinión ... – paulsm4

+0

Necesito la imagen, no el ícono de la imagen. ¿Puedo hacer un getImage() – CodeGuy

+0

esto es incorrecto? Obtengo un puntero nulo y sí, el camino es absolutamente correcto. – CodeGuy

0

Use el método getResource para leer los recursos dentro de la raíz de src. Por ejemplo, el siguiente código recupera imágenes de una carpeta src/images.

// Get current classloader 
ClassLoader cl = this.getClass().getClassLoader(); 
// Create icons 
Icon saveIcon = new ImageIcon(cl.getResource("images/save.gif")); 
Icon cutIcon = new ImageIcon(cl.getResource("images/cut.gif")); 

El ejemplo asume que existen las siguientes entradas en el archivo JAR de la aplicación:

images/save.gif 
images/cut.gif 
1

esta es la mejor manera de manejar todas las imágenes e iconos en un frasco de aplicaciones.

Una vez que haya comprimido todas sus imágenes e íconos en su propio archivo JAR - Configure su ruta de compilación agregando el archivo JAR de imágenes a la pestaña de sus bibliotecas para que ahora esté incluido en su classpath.

Entonces sólo tiene que utilizar los siguientes 3x líneas de código en el inicio de su Constuctor para acceder a cualquier imagen que necesita para cualquier cosa, incluyendo una imagen SystemTray que no acepta los simples de ImageIcon como su icono principal (raro lo sé) . Las líneas 3x son:

URL iconUrl = this.getClass().getResource("/image-iconb.png"); 
    Toolkit tk = this.getToolkit(); 
    imageIcon = tk.getImage(iconUrl); 

(imageIcon es sólo un declarado variable de imagen constructor) Ahora se puede establecer un icono ventana de la manera más simple:

setIconImage(imageIcon); 

y al mismo tiempo, utilice la misma variable al configurar System TrayIcon al declarar:

trayIcon = new TrayIcon(imageIcon, "SystemTray Demo", popupMenu); 

Lo anterior le permite declarar imágenes o ImageIcons fácilmente y centralmente sin correr el riesgo de no mantener los recursos de imágenes en el lugar correcto. Lo mantiene agradable y ordenado, con el JAR que contiene todas sus imágenes compiladas automáticamente en tiempo de ejecución y distribución de su programa.

Como beneficio adicional, una vez que el JAR se ha registrado en la ruta de clases - se puede seguir añadiendo otras imágenes en la misma JAR en cualquier momento sin ninguna queja también - Todo funciona y las imágenes agregadas están disponibles al instante a su aplicación

Mucho mejor en mi opinión.

3

puede usar la ruta relativa ya que la ruta relativa es la carpeta del proyecto.

ImageIcon img = new ImageIcon("src/PackageB/PackageBa/PackageBaa/MyImage.png"); 
Cuestiones relacionadas