2010-03-06 33 views
10

Ho un progetto Java con una barra degli strumenti e la barra degli strumenti contiene icone. Queste icone sono memorizzate in una cartella chiamata resources /, quindi ad esempio il percorso potrebbe essere "resources/icon1.png". Questa cartella si trova nella mia directory src, quindi quando viene compilata la cartella viene copiata in bin/Come accedere alle risorse nel file JAR?

Sto usando il seguente codice per accedere alle risorse.

protected AbstractButton makeToolbarButton(String imageName, String actionCommand, String toolTipText, 
     String altText, boolean toggleButton) { 

    String imgLocation = imageName; 
    InputStream imageStream = getClass().getResourceAsStream(imgLocation); 

    AbstractButton button; 
    if (toggleButton) 
     button = new JToggleButton(); 
    else 
     button = new JButton(); 

    button.setActionCommand(actionCommand); 
    button.setToolTipText(toolTipText); 
    button.addActionListener(listenerClass); 

    if (imageStream != null) { // image found 
     try { 
      byte abyte0[] = new byte[imageStream.available()]; 
      imageStream.read(abyte0); 

      (button).setIcon(new ImageIcon(Toolkit.getDefaultToolkit().createImage(abyte0))); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       imageStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } else { // no image found 
     (button).setText(altText); 
     System.err.println("Resource not found: " + imgLocation); 
    } 

    return button; 
} 

(imageName sarà "resources/icon1.png" ecc.). Funziona bene quando eseguito in Eclipse. Tuttavia, quando esporto un JAR eseguibile da Eclipse, le icone non vengono trovate.

Ho aperto il file JAR e la cartella delle risorse è lì. Ho provato di tutto, spostando la cartella, alterando il file JAR, ecc, ma non riesco a far apparire le icone.

Qualcuno sa cosa sto sbagliando?

(Come domanda a parte, c'è un monitor di file che può funzionare con file JAR? Quando si verificano problemi di percorso di solito apro FileMon per vedere cosa sta succedendo, ma si presenta semplicemente come accesso al file JAR in questo caso)

Grazie.

+1

Quindi 5 righe di codice per caricare l'icona sono migliori, quindi 2 righe di codice?Ovviamente per scoprire il segreto dell'utilizzo di 2 linee di codice dovresti effettivamente fare un po 'di lettura da solo. Immagino che il segreto rimarrà nascosto. – camickr

risposta

5

di caricare un'immagine da un uso delle risorse JAR il seguente codice:

Toolkit tk = Toolkit.getDefaultToolkit(); 
URL url = getClass().getResource("path/to/img.png"); 
Image img = tk.createImage(url); 
tk.prepareImage(img, -1, -1, null); 
+0

In quale pacchetto si trova quel Toolkit? – tomasb

+0

@tomasb java.awt.Toolkit – Christian

10

vedo due problemi con il tuo codice:

getClass().getResourceAsStream(imgLocation); 

Ciò presuppone che il file di immagine è nella stessa cartella del file .class della classe di questo codice è da, non in una cartella separata risorse. Prova a modificare:

getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation); 

altro problema:

byte abyte0[] = new byte[imageStream.available()]; 

Il metodo InputStream.available() fa non restituire il numero totale di byte nel flusso! Restituisce il numero di byte disponibili senza bloccare, che è spesso molto meno.

È necessario scrivere un ciclo per copiare i byte su uno ByteArrayOutputStream temporaneo fino al raggiungimento della fine del flusso. In alternativa, utilizzare getResource() e il metodo createImage() che accetta un parametro URL.

4

La sezione dell'esercitazione di Swing su How to Use Icons mostra come creare un URL e leggere l'icona in due istruzioni.

0

Per esempio in un progetto NetBeans, creare una cartella di risorse nella cartella src. Metti le tue immagini (jpg, ...) lì.

Sia che si utilizzi ImageIO o Toolkit (compresi getResource), è necessario includere un leader/nel percorso del file di immagine:

Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg")); 
setIconImage(image); 

Se questo codice è dentro la classe JFrame è aggiunto l'immagine da la cornice come un'icona nella barra del titolo.

Problemi correlati