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 :

comment afficher une image dans un jpanel ?


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 44
    Points : 23
    Points
    23
    Par défaut comment afficher une image dans un jpanel ?
    Bonjour,
    Dans la faq, je n'ai trouvé que de quoi accéder à une une image et pas comment on peut l'afficher dans un jpanel (je débute en java). Pourriez vous m'aider ?
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void jButtonSuivanteClicked(java.awt.event.MouseEvent evt) {
            java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
            java.net.URL url = getClass().getResource("D:\\yoda.jpg");
            Image image = toolkit.getImage(url);
    le problème c'est que je ne sais pas quoi mettre ensuite.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    j'ai rajouté ceci à la suite :

    MonPanel jPanelImage = new MonPanel(image);

    en ayant créé dans un fichier a part la classe "MonPanel" :

    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
    import java.awt.*;
    /**
     *
     * @author Sébastien
     */
    public class MonPanel {
     
        /** Creates a new instance of MonPanel */
        public MonPanel() {
        }
        /** variable de classe contenant l'image à afficher en fond */
            private Image image;
            /** Surcharge de la fonction paintComponent() pour afficher notre image */
             public void paintComponent(Graphics g) {
                    g.drawImage(image,0,0,null);
            } 
     
    }
    mais le compilo me met cette erreur :

    Compiling 1 source file to D:\licence L3 info\cour information et multimédia\projet1 Sébastien Champmartin\projet1\build\classes
    D:\licence L3 info\cour information et multimédia\projet1 Sébastien Champmartin\projet1\src\projet1\JFrameMainP1.java:133: cannot find symbol
    symbol : constructor MonPanel(java.awt.Image)
    location: class projet1.MonPanel
    MonPanel jPanelImage = new MonPanel(image);
    1 error
    BUILD FAILED (total time: 1 second)

  3. #3
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Bin tu as en gros deux methodes (enfin, j'en connais deux ).
    Sois tu as une JFrame avec une instance de JPanel sous la main, dans ce cas, tu crées une ImageIcon , l'ajoute a un JLabel, et ajoute enfin ce dernier a ton JPanel, comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ImageIcon icon = new ImageIcon("yoda.gif");
    JLabel img = new JLabel(icon);
    monPanel.add(img);
    Sois, tu as une classe qui étend JPanel, dans ce cas tu surcharges la methode paint de cette classe, comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void paint(Graphics comp) {
    Image img = Toolkit.getDefaultToolkit().getImage("yoda.gif");
    comp.drawImage(img, largeur, hauteur);
    La deuxieme methode je suis pas sur, je fais de tete, mais en gros c'est ça. Je n'ai pas approfondis le sujet, il doit y avoir d'autres methodes.
    Bonne chance

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    merci, j'ai remplacé la classe par ça :

    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
    import java.awt.*;
    import javax.swing.JPanel;
    /**
     *
     * @author Sébastien
     */
    public class MonPanel extends JPanel{
        private Image image;
        /** Creates a new instance of MonPanel */
        public MonPanel(Image i) {
           // super() ;
            image = i;
        }
     
             public void paint(Graphics g) {
                    super.paint(g);
                    g.drawImage(image,0,0,null);
            } 
     
    }
    je suppose que je dois appeler paint dans le programme principal ? mais en ayant initialisé "g" à quoi ?

  5. #5
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Normalement, tu n'as pas a appelé paint, il est appelé automatiquement quand tu affiche ton JPanel. Donc pas d'objet Graphics a initialisé !
    Attention a ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g.drawImage(image,0,0,null);//L'image n'apparaitra pas !
    L'image n'apparaitra pas, il me semble, car tu as spécifié une largeur/longueur de 0 pixel, donc une zone invisible...
    Si tu as ton gif sous la main, et que tu es sous win (j'ai pas encore migré sous *NIX, je sais pas lequel choisir ), vas dans les propriétées de ton gif et regardes sa longueur/largeur, reporte ensuite ces données dans ta methode paint.
    Toute fois, paint est une methode brut, c'est a dire que cela affichera dans ton JPAnel le contenu de paint en premier lieu, donc si tu as ajouté des composants graphiques (bouton, label, textfield, etc), tu risques d'avoir des problemes d'affichage. Dans ce cas où ton JPanel contient d'autre éléments graphiques, préfère la solution de l'ImageIcon/JLabel.
    Bonne chance

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    ok je poste mes modifications :
    méthode qui se déclenche quand on clique sur un bouton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void jButtonSuivanteClicked(java.awt.event.MouseEvent evt) {
            java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
            java.net.URL url = getClass().getResource("D:\\yoda.jpg");
            Image image = toolkit.getImage(url);
            MonPanel jPanelImage = new MonPanel(image);
            getContentPane().add(jPanelImage);
    la classe monPanel:

    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
    public class MonPanel extends JPanel{
        private Image image;
        /** Creates a new instance of MonPanel */
        public MonPanel(Image i) {
           // super() ;
            image = i;
        }
     
             public void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    int height = this.getSize().height;
                    int width = this.getSize().width;  
                    g.drawImage(image,0,0,415, 272, this);
            } 
     
    }

  7. #7
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Tu veux que l'image s'affiche quand on clique sur un bouton ?
    Et bien déjà, à la place de MouseListene, je te conseille ActionListener, qui est toute faite pour ce genre d'écoute.
    Ensuite, je ne vois pas comment faire pour ajouter une image quand on clique sur un bouton, avec la methode paint. Donc voiçi comment faire, avec le couple ImageIcon/JLabel.
    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
    //Premiere façon
    //Pour que ce code fonctionne t'as classe dois implementer ActionListener
    ImageIcon icon = new ImageIcon("yoda.gif");
    JLabel img;
    JButton btn = new JButton("IMAGE!");
    btn.addActionListener(this);
    //Methode appelé quand tu clique sur un bouton
    public void actionPerformed(ActionEvent e) {
             if(e.getSource() == btn) {
    //Se renseigne sur la source de l'évenement
    //Si la source est le bouton btn
    img = new JLabel(icon);
    tonPanel.add(img);
    }
    }
    Cette méthode est assez barbare, car elle recréer le JLabel a chaque fois que tu clique sur le bouton, et ajoute a chaque fois au JPanel l'image. Je ne crois pas que tu auras 5000 images a force de cliquez, car il me semble que une meme instance d'un composant ne peut pas etre "dupliquer" dans un JPanel, la nouvelle remplacera donc la dernier.
    Autre methode, plus conventionnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Meme code que la précédente sauf
    JLabel img = new JLabel(icon);
    //Veille a déclarer icon AVANT img ^^
    tonPanel.add(img);
    img.setVisible(false);
    //et ensuite
    public void actionPerformed(ActionEvent e) {
             if(e.getSource() == btn) {
                img.setVisible(true);
             }
    }//Cette méthode sera peut etre un peu plus rapide car ton composant
    //Et déjà ajouté au JPanel, tu ne fais que le rendre visible
    Inconvénient de la seconde méthode, si tu ne clique jamais au cours du programme sur le bouton, tu auras de la mémoire occupé inutilement tout au long de ton programme. (A moins que le gc le vide, mais la je sais pas).
    Voila bonne chance...
    P.S = Si tu veux utilisé la méthode paint, je te conseille d'allez faire un tour sur les tutorials de sun, sur java.sun.com.

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Sinon évite d'utiliser ToolKit.getDefaultToolkit().getImage(url), car celle ci ne rique de na pas charger correctement ton image

    Préfère lui l'utilisation de
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

Discussions similaires

  1. Debutant,comment afficher une image dans un Jpanel
    Par dilamax_1 dans le forum Graphisme
    Réponses: 1
    Dernier message: 27/04/2008, 16h05
  2. Réponses: 21
    Dernier message: 16/01/2008, 09h07
  3. Afficher une image dans un JPanel
    Par @omzo dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 19/05/2007, 00h19
  4. Afficher une image dans un JPanel
    Par yaya0057 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 04/04/2007, 00h10
  5. Réponses: 4
    Dernier message: 08/05/2006, 20h12

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