web-dev-qa-db-fra.com

Chargement de la ressource d'image

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

54
exlux15

Tout d'abord, changez cette ligne:

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

pour ça :

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

Plus d'informations , sur où se trouve la différence entre les deux approches, peuvent être trouvées sur ce fil - ( Différentes façons de charger une ressource

Pour Eclipse:

Pour NetBeans:

Pour IntelliJ IDEA:

  • Cliquez avec le bouton droit sur le dossier src du projet. Sélectionnez Nouveau -> Package
  • Sous Boîte de dialogue Nouveau package , saisissez le nom du package, dites ressources. Cliquez sur OK
  • Droite Cliquez sur package de ressources . Sélectionnez Nouveau -> Package
  • Sous Boîte de dialogue Nouveau package , saisissez le nom du package, dites images. Cliquez sur OK
  • Sélectionnez maintenant l'image que vous souhaitez ajouter au projet, copiez-la. Cliquez avec le bouton droit sur le package resources.images , à l'intérieur de [~ # ~] ide [~ # ~] , et sélectionnez Coller
  • Utilisez le dernier lien pour vérifier comment accéder à ce fichier maintenant en Java. Bien que pour cet exemple, on utilise

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

  • Presse Shift + F10, pour créer et exécuter le projet. Les dossiers ressources et images seront créés automatiquement dans le dossier out .

Si vous le faites manuellement:

EXEMPLE DE CODE DE RÉFÉRENCE RAPIDE (bien que pour plus de détails, considérez, Un petit lien de clarification supplémentaire):

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);
    }
}
71
nIcE cOw

Il y a moyen beaucoup plus facile 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(), cela fonctionne à la fois à partir du système de fichiers et d'un pot en fonction de la façon 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 getResource() est 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());
7
icza

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

6
trashgod