65 votes

Chargement de ressources telles que des images lors de l'exécution d'un projet distribué en tant qu'archive JAR

J'ai une erreur pour mon interface graphique. Essayer de définir l'icône de la barre de titre puis être inclus dans un JAR exécutable.

 BufferedImage image = null;
try {
    image = ImageIO.read(getClass().getClassLoader().getResource("resources/icon.gif"));
} 
catch (IOException e) {
    e.printStackTrace();
}

frame.setIconImage(image);

Voici l'erreur que j'obtiens :

 Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at GUI.<init>(GUI.java:39)
    at GUI.main(GUI.java:351)

L'image est dans le bon répertoire dont le dossier "ressources" est la racine du fichier de projet

94voto

nIcE cOw Points 16890

Tout d'abord, modifiez cette ligne :

image = ImageIO.read(getClass().getClassLoader().getResource("resources/icon.gif"));

à cette :

image = ImageIO.read(getClass().getResource("/resources/icon.gif"));

Plus d'informations Pour en savoir plus sur la différence entre les deux approches, voir ce fil de discussion - Différentes façons de charger une ressource

Pour Eclipse :

Pour NetBeans :

Pour IntelliJ IDEA :

  • Clic droit les src Dossier du projet. Sélectionnez Nouveau -> Paquet

  • U Boîte de dialogue Nouveau paquet , le nom du paquet, par exemple ressources . Cliquez sur OK

  • Droit Cliquez sur le paquet de ressources . Sélectionner Nouveau -> Paquet

  • U Boîte de dialogue Nouveau paquet , le nom du paquet, par exemple images . Cliquez sur OK

  • Sélectionnez maintenant l'image que vous souhaitez ajouter au projet et copiez-la. Cliquez avec le bouton droit de la souris sur le paquet resources.images à l'intérieur de la L'IDE et sélectionnez Coller

  • Utilisez le dernier lien pour vérifier comment accéder à ce fichier en code Java. Bien que pour cet exemple, on utiliserait

    getClass().getResource("/resources/images/myImage.imageExtension");

  • Pulse Shift + F10 pour réaliser et gérer le projet. Les ressources et images seront créés automatiquement à l'intérieur du sortir dossier.

Si vous le faites manuellement :

EXEMPLE DE CODE DE RÉFÉRENCE RAPIDE (pour plus de détails, voir le lien "Quelques précisions supplémentaires") :

package swingtest;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

/**
 * Created with IntelliJ IDEA.
 * User: Gagandeep Bali
 * Date: 7/1/14
 * Time: 9:44 AM
 * To change this template use File | Settings | File Templates.
 */
public class ImageExample {

    private MyPanel contentPane;

    private void displayGUI() {
        JFrame frame = new JFrame("Image Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new MyPanel();

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private class MyPanel extends JPanel {

        private BufferedImage image;

        public MyPanel() {
            try {
                image = ImageIO.read(MyPanel.class.getResource("/resources/images/planetbackground.jpg"));
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return image == null ? new Dimension(400, 300): new Dimension(image.getWidth(), image.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new ImageExample().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

11voto

icza Points 3857

Il y a un un moyen beaucoup plus simple pour charger et définir une image comme icône de cadre :

frame.setIconImage(
    new ImageIcon(getClass().getResource("/resources/icon.gif")).getImage());

Et c'est tout :) ! Vous n'avez même pas besoin d'utiliser un bloc try-catch car ImageIcon ne lève aucune exception déclarée. Et en raison de getClass().getResource() Il fonctionne à la fois à partir du système de fichiers et à partir d'un jar, en fonction de la manière dont vous exécutez votre application.

Si vous devez vérifier si l'image est disponible, vous pouvez vérifier si l'URL renvoyée par la commande getResource() es null :

URL url = getClass().getResource("/resources/icon.gif");
if (url == null)
    System.out.println( "Could not find image!" );
else
    frame.setIconImage(new ImageIcon(url).getImage());

7voto

trashgod Points 136305

Les fichiers image doivent se trouver dans le répertoire resources/ de votre JAR, comme indiqué dans Comment utiliser les icônes et cet exemple pour le répertoire nommé images/ .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X