Includere immagini .png in un .jar eseguibile!

di il
13 risposte

Includere immagini .png in un .jar eseguibile!

Ciao a tutti! Come da titolo ho un problema, ovvero,ho una applicazione ( un player mp3 ) che nella parte grafica ha delle icone contenenti immagini, tra cui i bottoni, ecc...Il problema è quando creo il file .jar eseguibile ( tramite Eclipse ), le immagini non vengono visualizzate !
La cartella contenente le immagini si trova in "nomeProgetto/Immagini/" , quindi insieme alle classiche cartelle "bin","src","doc",ecc...come devo fare per far si che le immagini vengano incluse, e riconosciute, nel file eseguibile .jar ? Grazie.

P.S. Le immagini sono in formato .png e per acquisirle utilizzo "ImageIcone image = new ImageIcon(path+fileName);"

13 Risposte

  • Re: Includere immagini .png in un .jar eseguibile!

    Ciao,
    le puoi mettere in un'apposita cartella dentro a src (che viene poi esportata nel file .jar). Dal codice le richiami con getResource.
    A titolo di esempio ti posto una parte di codice che avevo utilizzato per un software:
    
    		URL imgURL = getClass().getResource("/images/backup.png");
    		ImageIcon image = new ImageIcon(imgURL);
    		frame.setIconImage(image.getImage());
    
  • Re: Includere immagini .png in un .jar eseguibile!

    Grazie milleee!!! mi inchino a te! scherzi a parte,grazie mille, mi hai tolto un dubbio che mi tormentava!
  • Re: Includere immagini .png in un .jar eseguibile!

    Felice di essere stato di aiuto!

  • Re: Includere immagini .png in un .jar eseguibile!

    Ciao,
    riprendo la discussione perché anch'io ho un minimo di problema per le immagini.
    Voevo chiederti se
    
    getClass().getResource("/images/backup.png");
    
    dipende anche dal package

    Io ho le mia classi divise in package ognuno per il gruppo di funzioni che svolgono.
    quindi le Gui, il controllo le utils e così via
    quindi ho ad esempio il package com.dot.control.
    ho applicato il metodo sopracitato ma mi ritorna sempre null.

    Grazie per ogni aiuto/consiglio
  • Re: Includere immagini .png in un .jar eseguibile!

    schumy2000 ha scritto:


    
    getClass().getResource("/images/backup.png");
    
    dipende anche dal package
    La regola generale (e documentata in getResource): se la specifica inizia con '/' (come nel codice sopra) allora il nome "images/backup.png" è "assoluto", ovvero "images" deve essere alla "radice" lungo il classpath.
    Se non inizia con '/' allora la specifica è "relativa" al package della classe (il Class) su cui si invoca getResource.
  • Re: Includere immagini .png in un .jar eseguibile!

    Ho provato in tutti i modi, ma non funziona per niente.
    
    String _path="/"+tmp.getLogo();
    java.net.URL imgURL = getClass().getResource(_path);
    
    all'interno di getLogo() ho già il path costruito (img/foo.png) pensavo che mettendo lo slash all'inizio si riuscisse a prendere l' immagine ma mi da sempre errore.

    Se scrivo
    
    label= new JLabel(new ImageIcon(tmp.getLogo()));
    
    in questo caso ovviamente me lo prende..
    ho provato anche tramite il ClassLoader ma non riesco a prendere in nessun modo questa immagine.

    C'è qualcosa che sbaglio?

    Grazie
  • Re: Includere immagini .png in un .jar eseguibile!

    schumy2000 ha scritto:


    
    String _path="/"+tmp.getLogo();
    java.net.URL imgURL = getClass().getResource(_path);
    
    all'interno di getLogo() ho già il path costruito (img/foo.png) pensavo che mettendo lo slash all'inizio si riuscisse a prendere l' immagine ma mi da sempre errore.
    Quindi la specifica completa diventa "/img/foo.png", giusto?
    E la cartella 'img' è in classpath e contiene un foo.png?
  • Re: Includere immagini .png in un .jar eseguibile!

    andbin ha scritto:


    Quindi la specifica completa diventa "/img/foo.png", giusto?
    Esatto

    andbin ha scritto:


    E la cartella 'img' è in classpath e contiene un foo.png?
    a questo ci pensa Eclipse, ma in teoria non dovrebbe essere in classpath img bensi la directory precedente, però se faccio
    
    label= new JLabel(new ImageIcon("img/foo.png"));
    
    me lo prende normalmente quindi cmq dovrebbe essere in classpath altrimenti non mi avrebbe preso nemmeno in questo modo.
  • Re: Includere immagini .png in un .jar eseguibile!

    schumy2000 ha scritto:


    ma in teoria non dovrebbe essere in classpath img bensi la directory precedente
    Sì scusa, prima ero di fretta e non sono stato preciso: la cartella che contiene la 'img' deve essere in classpath.

    schumy2000 ha scritto:


    
    label= new JLabel(new ImageIcon("img/foo.png"));
    
    me lo prende normalmente quindi cmq dovrebbe essere in classpath altrimenti non mi avrebbe preso nemmeno in questo modo.
    Quest'ultimo tuo codice non usa il classpath! È una normale specifica sul file-system che è relativa alla directory "corrente".
  • Re: Includere immagini .png in un .jar eseguibile!

    La cartella è così.

    Adesso ho provato a mettere la cartella img sotto bin e solo in quel caso mi prende...

    Edit:
    ho messo in classpath la cartella img perché secondo Eclipse non posso metter in classpath la stessa che contiene src.
    
    String _path="/../"+tmp.getLogo();			
    java.net.URL imgURL = getClass().getResource(_path);
    
    E così ovviamente funziona, è una soluzione troppo elaborata.
  • Re: Includere immagini .png in un .jar eseguibile!

    Ho creato il classpath come cartella esterna e non del progetto e così funziona.

    Grazie per la pazienza.

    Ciao.
  • Re: Includere immagini .png in un .jar eseguibile!

    schumy2000 ha scritto:


    Adesso ho provato a mettere la cartella img sotto bin e solo in quel caso mi prende...
    E così ovviamente funziona, è una soluzione troppo elaborata.
    Sotto 'bin' non dovresti mettere nulla in modo diretto ... è la destinazione del build.

    Se le tue "risorse" (immagini, testi, ecc...) sono parte "fissa" della tua applicazione, allora dovranno essere incorporate insieme al resto del programma. Quindi finiranno di norma insieme alle classi nello stesso jar.

    Pertanto è bene che le risorse siano sotto 'src' (e un IDE di norma ribalta le risorse sotto 'bin') e preferibilmente in un sotto-package specifico. Una buona soluzione (che ho usato anch'io più volte) è avere un package apposito es.

    com.pincopalla.resource

    e dentro metterci le tue risorse (immagini, testi, ecc....) e poi (ora viene il bello), mettere in questo package anche una semplice classe di utility del tipo:
    package com.pincopalla.resource;
    
    // import necessari .....
    
    public class AppResources {
        private AppResources() {}
    
        public static Icon getIcon(String name) {
            URL url = AppResources.class.getResource(name);
            return new ImageIcon(url);
        }
    }
    e poi da qualunque altra parte es.
    Icon fooIcon = AppResources.getIcon("foo.png");
    Siccome la specifica "foo.png" non inizia con "/" e siccome il getResource è sul Class di AppResources che è nello stesso package delle risorse .... allora funziona bene e sempre.

    E in questo modo si incapsula pure e quindi si tiene nascosto all'esterno tutti i dettagli di dove sono le risorse e come vengono caricate.
  • Re: Includere immagini .png in un .jar eseguibile!

    Ottima idea.
    mi metto al lavoro per realizzarla.

    Grazie mille andbin.
    ciao.
Devi accedere o registrarti per scrivere nel forum
13 risposte