Précédent   Forum du club des développeurs et IT Pro > Java > Interfaces Graphiques en Java > AWT/SWING
AWT/SWING
Forum d'entraide pour les API Swing et AWT. Avant de poster -> FAQ AWT/SWING
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/04/2006, 19h11   #1
180degrés
Invité régulier
 
Inscription : 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.
180degrés est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2006, 20h55   #2
180degrés
Invité régulier
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 6
Points : 6
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)
180degrés est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2006, 20h57   #3
Janitrix
Expert Confirmé
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 912
Points : 2 912
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
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2006, 21h38   #4
180degrés
Invité régulier
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 6
Points : 6
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 ?
180degrés est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2006, 22h43   #5
Janitrix
Expert Confirmé
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 912
Points : 2 912
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
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2006, 23h05   #6
180degrés
Invité régulier
 
Inscription : juillet 2005
Messages : 44
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 44
Points : 6
Points : 6
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);
        } 
 
}
180degrés est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 12h42   #7
Janitrix
Expert Confirmé
 
Avatar de Janitrix
 
Inscription : octobre 2005
Messages : 3 398
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 3 398
Points : 2 912
Points : 2 912
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.
Janitrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 15h33   #8
sinok
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 644
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 644
Points : 12 452
Points : 12 452
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.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h51.


 
 
 
 
Partenaires

Hébergement Web