IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Changer le background (image) d'un JPanel


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par défaut Changer le background (image) d'un JPanel
    Bonjour à toutes/tous,

    Je cherche à changer le fond d'un JPanel sur un ActionPerformed d'un bouton.
    Ma frame affiche des produits, avec caractéristiques remplissant du JTextField et à côté, un JPanel que j'ai dérivé en PanelPhoto qui affiche (en théorie) la photo du produit en question.

    Je parcours l'ensemble des mes produits avec deux JButton, précédent et suivant.
    Lors du premier chargement, aucun problème, monPanelPhoto m'affiche la photo du premier produit en catalogue, mais pour la MàJ, là y'a gros problème.

    Voici une classe simple pour mon panel mais qui marche bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    public class PanelPhoto extends JPanel {
     
        private BufferedImage image;
        private String nomFicImg;
        private int larg;    // largeur de l'image
        private int haut;    // hauteur de l'image
        private int x, y;// coordonnees du coin sup gauche
     
        public PanelPhoto(String _nomFicImg)
        {
            super();
            this.setNomFicImg(_nomFicImg);
            try
            {
                image = null;
                File ficImg = new File(nomFicImg);
                image = ImageIO.read(ficImg);
            }
            catch (IOException e)
            {
                image = null;
                System.out.println("Fichier invalide");
            }
     
            this.larg = image.getWidth();
            this.haut = image.getHeight();
     
            this.x = 0;
            this.y = 0;
     
            setVisible(true);
        }
     
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(image, x, y, larg, haut, null);
        }
    }
    J'ai essayé diverses solutions: .imageUpdate sur le JPanel, setBackground qui ne mange que du Color et pas du PNG/JPG/etc...
    J'ai aussi essayé de voir avec du repaint() sur le JPanel et sur la frame le contenant, mais ça repaint() avec une nouvelle image, si on peut changer les propriétés du panel, que j'ai essayé de faire avec du setX() sur le nom du fichier puis le charger à nouveau, mais je ne peux accéder aux fonctions de ma classe (problème de static ?)

    Quelle approche me conseilleriez-vous ?

    Par avance, merci
    citizenM

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    g.drawImage(image, x, y, larg, haut, null);
    Tu dessines dans rien ???

  3. #3
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Il y a un moment, j'avais le meme problème que toi, tu peut réussir avec cette classe il me semble :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    package tip;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.beans.*;
    import javax.swing.*;
    /**
    * Cette classe est tout simplement un JPanel possédant une image en arrière plan.
    *
    */
    public final class ImagePanel extends JPanel {
    private static final long serialVersionUID = -2578790090805272257L;
    public static final String IMAGE_PROPERTY = "ImagePanel.image";
    private InnerListener innerListener = new InnerListener();
    /**
    * Constructeur par défaut, il va initialiser le panel
    * @param image
    */
    public ImagePanel(BufferedImage image) {
    super();
    addPropertyChangeListener(IMAGE_PROPERTY, innerListener);
    setImage(image);
    }
    /**
    * Méthode qui spécifie l'image à dessinner
    * @param image
    */
    public void setImage(BufferedImage image) {
    putClientProperty(IMAGE_PROPERTY, image);
    }
    /**
    * Méthode qui retourne l'image affichée actuellement
    * @return l'image
    */
    public BufferedImage getImage() {
    return (BufferedImage) getClientProperty(IMAGE_PROPERTY);
    }
    /**
    * Méthode qui dessinne l'image sur le composant
    */
    protected void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);
    BufferedImage image = getImage();
    if (image != null) {
    graphics.drawImage(image, 0, 0, null);
    }
    }
    /**
    * Classe listener du JPanel
    *
    */
    private class InnerListener implements PropertyChangeListener {
    /**
    * Méthode appelée lors du changement d'une propriété du JPanel
    */
    public void propertyChange(PropertyChangeEvent event) {
    String property = event.getPropertyName();
    if (property.equals(IMAGE_PROPERTY)) {
    BufferedImage image = getImage();
    int width = 0;
    int height = 0;
    if (image != null) {
    width = image.getWidth(null);
    height = image.getHeight(null);
    }
    Dimension size = new Dimension(width, height);
    setPreferredSize(size);
    setMinimumSize(size);
    repaint();
    }
    }
    }
    }
    Pour changer l'image par la suite, il te suffira de faire setImage(tonImage);

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 896
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par Vrylx
    g.drawImage(image, x, y, larg, haut, null);
    Tu dessines dans rien ???
    Il dessine tout simplement dans g.
    La valeur du dernier parametre n'a rien a voir avec le pb : il s'agit de passer un ImageObserver qui sera notifie des etapes d'avancement du chargement de l'image si celle-ci a ete chargee de maniere asynchrone. En general mieux vaut mettre null, sinon ca a tendance a ralentir de traitement.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    C'est quoi ton "gros problème"? Ca crashe ou ça n'affiche pas l'image?

    Bon question bête : tu mets bien à jour ton image quand tu cliques sur "précédent" ou "suivant"? Tu ne fais pas que mettre à jour le fichier, mais tu recrées bien une nouvelle image?
    Si tu pouvais mettre le code de tes boutons, pour qu'on voit ce que tu fais...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par défaut
    @bouye: Tout à fait bouye, j'allais le dire, mais apparemment, dans son élan de générosité, Vrylx s'est enflammé

    Celsius 25, c'est le nom qu'il devrait prendre ^^

    @seiryujay: l'image ne s'affiche pas, et je teste la version de wichtounet.
    En fait, dans une version précédente, j'utilisais un setImage(String nomDuFic) et je lancais un pseudo repaint() dessus, repaint() qui allait ouvrir la nouvelle image et changeait la propriété, espérant que le repaint allait ouvrir l'image, et afficher la nouvelle image en background.
    Et j'aime beaucoup ton avatar

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par défaut
    @wichtounet:

    Merci beaucoup, j'ai implémenté ton code avec le mien et comme ça mon panel marche très bien, il se met bien à jour à chaque monPanel.setImage().

    C'est juste que cet en***ré de NetBeans ne me laisse pas typer correctement mon panel dans le type dérivé que j'ai créé, je suis obligé de le faire manuellement en dehors de NetBeans, si quelqu'un a une idée.

    Par défaut il me met javax.swing.JPanel et non monpackage.PanelPhoto.

    Je vais le taper !


    C'est peut-être parce que je code sous Mac tiens... Ah les sectaires

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment changer le background image?
    Par javadz dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 28/02/2014, 09h40
  2. Changer dynamiquement background-image
    Par JCMANSION dans le forum ASP.NET
    Réponses: 20
    Dernier message: 21/10/2010, 12h00
  3. Changer le background d'un div à partir d'une image map.
    Par Daï2 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 03/08/2009, 10h02
  4. [JPanel] background image
    Par benderSobre dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 02/07/2008, 21h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo