AFFICHER UNE IMAGE EN ARRIÈRE PLAN DANS UN JPANEL

Signaler
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
-
Messages postés
16410
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2021
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54144-afficher-une-image-en-arriere-plan-dans-un-jpanel

Messages postés
16410
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2021
122
Une suggestion d'amélioration, pour permettre de charger une image à l'intérieur d'un JAR :

/**
 * Change l'image à afficher.<br>
 * L'image est d'abord cherchée à l'intérieur du classpath (le JAR s'il existe)<br>
 * Si elle n'a pas été trouvée, elle est cherchée dans le système de fichiers.
 * @param path le chemin d'accès à la nouvelle image
 * @throws IOException si l'image n'est pas chargée
 */
public void setImage(String path) throws IOException
{
    try
    {
        URL inJar = getClass().getClassLoader().getResource(path);
        
        if (inJar != null)
            image = ImageIO.read(inJar);
        else
            image = ImageIO.read(new File(path));
    } 
    catch (Exception e)
    {
        throw new IOException("unloadable: "+path, e);
    }
        
    repaint();
}
Messages postés
491
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
15 juillet 2012
10
C'est vrai que beaucoup de gens veulent savoir comment ajouter une image de fond à une fenêtre. La façon facile est d'ajouter une image à un JLabel, puis ajouter le JLabel à la fenêtre. Le code de cette approche facile serait quelque chose comme ceci:

JLabel contents = new JLabel ();
contents.setIcon (image);
contents.setLayout (new BorderLayout ());
frame.add(contents);

Pourquoi ceci fonctionne? Eh bien, rappelez-vous que tous les composants Swing hérites de la classe "Container", de sorte que vous pouvez ajouter des composants enfants. Toutefois, par défaut, un JLabel utilise une disposition nulle et les composants n'apparaissent pas. En utilisant un BorderLayout, le JLabel peut maintenant fonctionner comme un JPanel et être utilisé comme un volet de contenu.

Cependant, cette approche présente des inconvénients, surtout parce qu'un JLabel peint l'image à sa taille réelle. Donc, en réalité, elle ne serait probablement utilisée uniquement sur les fenêtres de taille fixe, où la taille de la fenêtre est déterminée par la taille de l'image.

Dans la plupart des autres cas, nous devons adopter une approche plus flexible, donc nous avons besoin d'un composant plus souple. PanelImage, présentée ici par notre cher ami Julien39, est une extension de JPanel qui permet aux images d'être peint à l'échelle.

BackgroundPanel est également une extension de JPanel:
http://www.camick.com/java/source/BackgroundPanel.java
Le support de base fourni par cette classe permet aux images d'être peint dans l'un des trois styles suivants:

* L'image à l'échelle (la valeur par défaut)
* Les images en mosaïque
* L'image à la taille réelle - la position de l'image est contrôlé en précisant l'alignement horizontal et vertical (l'alignement au centre est la valeur par défaut)

En plus de dessiner des images, ce composant peut également être utilisé pour les fonds qui ne sont pas une couleur unie. L'API Java fournit une interface "Paint" très commode. Une nouvelle méthode setPaint (...) a été ajouté pour spécifier un objet "Paint" pour être utilisé par le code de peinture personnalisée. L'objet "Paint" peut être utilisé sans une image. Lorsqu'à la fois une image et un objet "Paint" sont utilisés, l'ordre de la peinture sera:

* Peindre le fond
* Peindre à l'aide de l'objet Paint
* Dessiner l'image

En outre, les méthodes add(...) ont été substituées pour rendre non-opaque chaque composant ajouté au panneau. Après tout, si vous vous faites la peine de créer un beau fond de fantaisie, vous ne voulez pas qu'un composant opaque bloque la peinture personnalisée. Pour les composants qui utilisent un "renderer", le "renderer" devra également faire preuve de transparence. Par exemple, sur une JTable, vous pouvez utiliser le code suivant pour définir la valeur alpha de la couleur à 0, ce qui se traduit par une couleur de fond transparente:

table.setBackground( new Color(0, 0, 0, 0) );

Pour finir, voici encore un exemple de code utilisé pour créer un panneau qui utilise à la fois une image et un objet Paint:

BackgroundPanel panel = new BackgroundPanel(image, BackgroundPanel.ACTUAL, 1.0f, 0.5f);
GradientPaint paint = new GradientPaint(0, 0, Color.BLUE, 600, 0, Color.RED);
panel.setPaint(paint);