Comment puis-je afficher une image dans un Composite

Ma question ici est de savoir comment puis-je afficher une image dans un Composite? D'autres sujets ici pour demander quelque chose de similaire ne sont pas clair pour mon sujet de comment je peux faire cela.

J'ai un répertoire dans mon dossier de projet qui ont des fichiers d'image Project Folder/GUI/img, spécifiquement gray.png et green.png qui je veux afficher dans un Composite.

J'ai essayé avec le code suivant à l'aide de ImageIcon et JLabel que j'ai trouvé dans d'autres post:

ImageIcon image = new ImageIcon("GUI/img/gray.png");
JLabel label = new JLabel(image);

//JPanel panel is already initialized by the IDE
panel.add(label)

Mais ne fonctionne pas... Le JPanel rester vide, sans afficher la moindre image. Comment puis-je le faire?

Supplémentaire à cette, je veux que l'image à l'intérieur de la JPanel changement (gray.png pour green.png) lorsqu'une action est effectuée, par exemple en appuyant sur un bouton. Je peux archive que par la même méthode pour afficher l'image dans l' JPanel droit?

Merci d'avance!

EDIT: Voici un exemple de code de test pour obtenir ce. L'initialisation est effectuée automatiquement par l'IDE.

import java.awt.Image;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
public class Sample extends javax.swing.JFrame {
public Sample() {
initComponents();
}
//Initialization
private void initComponents() {
PanelImage = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
});
javax.swing.GroupLayout PanelImageLayout = new javax.swing.GroupLayout(PanelImage);
PanelImage.setLayout(PanelImageLayout);
PanelImageLayout.setHorizontalGroup(
PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
PanelImageLayout.setVerticalGroup(
PanelImageLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(61, 61, 61)
.addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(239, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(45, 45, 45)
.addComponent(PanelImage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(155, Short.MAX_VALUE))
);
pack();
}                    
private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
try {
DisplayImage(PanelImage, "/GUI/img/gray.png");
} catch (Exception ex) {
Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex);
}
}                                 
//For display the url image in a JPanel
private void DisplayImage(JPanel jp, String url) throws IOException, Exception {
try {
Image image=ImageIO.read(this.getClass().getResource(url));
ImageIcon imageicon=new ImageIcon(image);
JLabel label=new JLabel(imageicon);
jp.add(label);
} catch (IOException ex) {
throw new IOException();
} catch (Exception ex) {
throw new Exception();
}
}
public static void main(String args[]) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Sample.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Sample().setVisible(true);
}
});
}
//Variables declaration                  
private javax.swing.JPanel PanelImage;                
}

La private void DisplayImage(JPanel jp, String url) est ce que j'ai besoin de travailler pour afficher l'image, à partir de l'url String url dans le JPanel jp

Post complet d'un exemple minimal de reproduire le problème.
Essayez d'utiliser ImageIO.read(new File("GUI/img/gray.png")), cela va lever une exception si l'image ne peut pas être chargé pour une raison quelconque, qui ImageIcon ne sera pas. Voir Lecture/Chargement d'une Image pour plus de détails
dans les exemples impliquant des images, je tiens à ajouter les conseils suivants - Une manière d'obtenir de l'image(s) pour un exemple de lien pour les images vues dans ce Q&A.
Regarde comme l'ajout de la composante problème (pas de nouvelle disposition a été déclenché). Essayez de le revalider et repeindre votre panneau (panel.revalidate(); et panel.repaint();) après l'ajout de votre logo au panneau.
essayé les deux méthodes panel.revalidate() et panel.repaint() avec aucun effet. Le panneau ne fonctionne toujours pas afficher l'image.

OriginalL'auteur FiroKun | 2016-04-04