2012-10-02 2 views
4

J'écris un programme qui nécessite d'avoir un bouton avec une image dessus, cependant, jusqu'ici, je n'ai pas réussi à le faire fonctionner. J'ai vérifié plusieurs autres messages sur ce site, y compris How do I add an image to a JButton.
Mon code:Comment mettre une image sur un JButton?

public class Tester extends JFrame 
{ 
    public Tester() 
    { 
     JPanel panel = new JPanel(); 
     getContentPane().add(panel); 
     panel.setLayout(null); 

     setTitle("Image Test"); 
     setSize(300,300); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     JButton button = new JButton(); 
     try 
     { 
      Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif")); 
      button.setIcon(new ImageIcon(img)); 
     } 
     catch (IOException ex) {} 

     button.setBounds(100,100,100,100); 
     panel.add(button); 
    } 

    public static void main(String[] args) 
    { 
     Tester test = new Tester(); 
     test.setVisible(true); 
    } 
} 

Lorsque ce code est exécuté, une erreur se produit: Exception dans le thread "principal" java.lang.IllegalArgumentException: entrée == null! Cette erreur se produit à la ligne:

Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif")); 

Je ne pense pas que cette erreur est due au fichier ne pas être trouvé par code java, mon dossier Images est dans le dossier src (je suis en utilisant Eclipse) comme recommandé par le lien ci-dessus.
Est-ce que quelqu'un a des idées sur ce que le problème peut être?
Merci.

+0

Veuillez indiquer le chemin de l'image dans la hiérarchie de votre projet – CAMOBAP

+1

Avez-vous vérifié la valeur de retour de 'getResource()'? – vstm

+0

Ceci est le chemin de l'image: C: \ Documents and Settings \ étudiant \ Mes documents \ Dropbox \ ADVCS_Workspace \ Chess_Program \ src \ Images –

Répondre

9

En utilisant Eclipse, vous ne gardez pas vos images dans dossier src au lieu de créer un Source Folder à cet effet. S'il vous plaît se référer à ce lien concernant la façon de add images to resource folder in Eclipse.

+1

+1 joli lien :) yup je pense qu'il pourrait être qu'il n'a pas la barre oblique –

+0

Plus si le souci pour moi, n'utilise pas la source FOlder pour le dity, comme le PO a déclaré que les images sont dans le dossier src , dont je doute est la bonne façon IMHO –

+1

Dossiers de ressources sont de simples conventions. Vous n'avez pas besoin d'utiliser un 'dossier de ressources' spécial pour que vos images soient lues. Votre chemin doit juste être correct. – davidXYZ

2

Utilisez ceci pour créer le bouton.

JButton button = new JButton(new ImageIcon(getClass().getClassLoader() 
              .getResource("Images/BBishopB.gif"))); 

Et ce que vous faites est le réglage de la Image comme l'icône. Cela ne fonctionne pas car la méthode setIcon() requiert des objets qui implémentent l'interface Icon. J'espère que cela t'aides.

+0

Cela ne résoudra pas son problème si l'image ne peut être trouvée. Et la deuxième partie de votre réponse est incorrecte, car il lit l'image à une image et ensuite envelopper cette image dans un ImageIcon. Donc cette partie du code est correcte. –

+0

@GuillaumePolet Cette partie crée directement ImageIcon à partir de l'URL sans impliquer la partie inutile de 'ImageIO' et autres. –

+0

Vous avez dit, et je cite: _ Cela ne fonctionne pas car la méthode setIcon() nécessite des objets qui implémentent l'Icon interface_. Cette déclaration est incorrecte. –

2

Essayez de mettre une barre oblique foward avant le nom du paquet dans getResource() comme ceci:

Image img = ImageIO.read(getClass().getResource("/Images/BBishopB.gif")); 
1

Vous pouvez juste trouver l'image directement:

JButton jb = new JButton(new ImageIcon("pic.png")); //pic is in project root folder 
//Tip: After placing the image in project folder, refresh the project in Eclipse. 

ou si l'image sera dans un JAR, je crée habituellement une fonction pour faire la récupération pour moi afin que je puisse le réutiliser.

public static ImageIcon retrieveIcon(String path){ 
    java.net.URL imgUrl = 'classpackage'.'classname'.class.getResource(path); 
    ImageIcon icon = new ImageIcon(imgUrl); 
    return icon; 
} 

Alors je vais le faire,

JButton jb = new JButton(retrieveIcon("/pic.png")); 
1
Image img = ImageIO.read(getClass().getResource("Images\\BBishopB.gif")); 

Cette ligne essaie d'en faire trop en une seule fois ce qui le rend difficile à traquer une erreur lorsque vous obtenez un. Je suggère la découper:

URL imgURL = getClass().getResource("Images\\BBishopB.gif"); 
Image img = ImageIO.read(imgURL); 

Maintenant, vous pouvez utiliser le débogueur Eclipse pour vérifier la valeur de retour de imgURL, qui est le candidat le plus probable pour le NPE. Même si cela ne vous dit pas pourquoi vous obtenez un message d'erreur, cela réduit considérablement le problème.

Questions connexes