Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Invité régulier
    Inscrit en
    juillet 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 44
    Points : 6
    Points
    6

    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 :
    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
    Invité régulier
    Inscrit en
    juillet 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 44
    Points : 6
    Points
    6

    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 :
    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
    Expert Confirmé
    Avatar de Janitrix
    Inscrit en
    octobre 2005
    Messages
    3 393
    Détails du profil
    Informations forums :
    Inscription : octobre 2005
    Messages : 3 393
    Points : 3 290
    Points
    3 290

    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 :
    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 :
    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
    Invité régulier
    Inscrit en
    juillet 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 44
    Points : 6
    Points
    6

    Par défaut

    merci, j'ai remplacé la classe par ça :

    Code :
    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
    Expert Confirmé
    Avatar de Janitrix
    Inscrit en
    octobre 2005
    Messages
    3 393
    Détails du profil
    Informations forums :
    Inscription : octobre 2005
    Messages : 3 393
    Points : 3 290
    Points
    3 290

    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 :
    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
    Invité régulier
    Inscrit en
    juillet 2005
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 44
    Points : 6
    Points
    6

    Par défaut

    ok je poste mes modifications :
    méthode qui se déclenche quand on clique sur un bouton:

    Code :
    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 :
    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
    Expert Confirmé
    Avatar de Janitrix
    Inscrit en
    octobre 2005
    Messages
    3 393
    Détails du profil
    Informations forums :
    Inscription : octobre 2005
    Messages : 3 393
    Points : 3 290
    Points
    3 290

    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 :
    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 :
    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
    Modérateur
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 762
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 762
    Points : 12 849
    Points
    12 849

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •