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
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:
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);
}
}
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());
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/
.