Come accedere alle risorse nel file JAR?

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 /

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 una domanda a parte, c’è un monitor di file che può funzionare con i file JAR? Quando sorgono problemi di percorso di solito apro FileMon di solito per vedere cosa sta succedendo, ma si presenta semplicemente come accesso al file JAR in questo caso)

Grazie.

Per caricare un’immagine da una risorsa JAR, utilizzare 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); 

Vedo due problemi con il tuo codice:

 getClass().getResourceAsStream(imgLocation); 

Ciò presuppone che il file di immagine si trovi nella stessa cartella del file .class della class da cui proviene questo codice, non in una cartella di risorse separata. Prova questo invece:

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

Un altro problema:

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

Il metodo InputStream.available() non restituisce il numero totale di byte nello stream! Restituisce il numero di byte disponibili senza bloccare, che è spesso molto meno.

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

La sezione del tutorial di Swing su Come usare le icone mostra come creare un URL e leggere l’icona in due istruzioni.

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

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

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

Se questo codice si trova nella tua class JFrame, l’immagine viene aggiunta al frame come un’icona nella barra del titolo.