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

 Java Discussion :

Afficher une Image dans un JLabel


Sujet :

Java

  1. #1
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut Afficher une Image dans un JLabel
    Bonjour,

    Introduction:
    J'ai vu sur internet que ce sujet était abordé de nobmreuse fois mais AUCUN ne correspondaient à mon sujet précis.

    Présentation:
    Alors voila je souhaite créer une classe (ici nommée "image.java") qui contiendra une méthode me permettant d'afficher des images à l'endroit ou je veux.(Pour dans le futur l'utiliser pour un jeux mais ce n'est pas vraiment important mtn.)

    Problème:
    Mon code ne compile apparement sans erreur mais mon image ne s'affiche pas.Pourquoi?

    Code:

    Voici ma classe "Main.java"
    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
    package imageTest;
     
    import java.awt.Dimension;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class Main extends JPanel {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		JFrame fenPrincipale=new JFrame("-ProjetNfa032-");//On definit la JFrame //fen=fenetre
            fenPrincipale.setSize(new Dimension(750,500));
            fenPrincipale.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            Image imgTest= new Image();
            imgTest.adresseImg="C:\\Users\\antoine\\Desktop\\imgGalaxy.jpg";
            JPanel panImgTest = null;
            imgTest.fctAfficherImg(panImgTest, 0, 0);
     
            fenPrincipale.setVisible(true);
     
    	}
     
    }
    Et voici ma classe "Image.java"
    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
    package imageTest;
     
    import java.io.IOException;
     
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    public class Image extends JPanel{
     
    	String adresseImg;
     
    	public JPanel fctAfficherImg(JPanel pan ,int posX ,int posY){
    		pan=new JPanel();//
    		Icon imgIcon=new ImageIcon(adresseImg);
     
    		JLabel imgJLabel = new JLabel ();//
    		imgJLabel.setIcon(imgIcon);
     
    		pan.setLayout(null);//positionement-mise en forme du JPanel
    		try {
    			pan.setBounds(posX,posY,ImageUtil.getImageHeight(adresseImg),ImageUtil.getImageWidth(adresseImg));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		pan.add(imgJLabel);
     
    		return pan;
    	}
     
    }
    D'avance merci de votre aide la je suis vraiment bloqué.

    EDIT1eut etre ceci vient il de ma volonté de placer "en position absolu" mon JPanel?Mais j'en ai ABSOLUMEN BESOIN ! pour la suite.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    A priori, je dirais que l'erreur arrive dans ,ImageUtil.getImageHeight(adresseImg) ou/et ImageUtil.getImageWidth(adresseImg) (quand on a une erreur, c'est mieux de nous montrer la stacktrace complète). Peut-on voir le code de ces méthodes ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut Reponse Joel Drigo
    Ces 2methodes viennent d'une "class" fournies par le prof.Elles permettent de retourner la hauteur et la largeur de l'image passée ne paramètre.

    *)
    Voici le code des 2méthodes concernées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    static int getImageWidth(String fnam) throws IOException{
        BufferedImage bufi = ImageIO.read(new File(fnam));
        return bufi.getWidth();
      }
      static int getImageHeight(String fnam) throws IOException{
        BufferedImage bufi = ImageIO.read(new File(fnam));
        return bufi.getHeight();
      }
    *)
    Voila le code de toutes la classeau cas ou)
    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
    public class ImageUtil{
      static int[] readImage(String fnam) throws IOException{
        int[] tab;
        BufferedImage bufi = ImageIO.read(new File(fnam));
        int width = bufi.getWidth();
        tab = bufi.getRGB(
                          0,
                          0,width,bufi.getHeight(),null,
                          0,
                          width);
        return tab;
      }
      static int getImageWidth(String fnam) throws IOException{
        BufferedImage bufi = ImageIO.read(new File(fnam));
        return bufi.getWidth();
      }
      static int getImageHeight(String fnam) throws IOException{
        BufferedImage bufi = ImageIO.read(new File(fnam));
        return bufi.getHeight();
      }
      static int[] explodePixel(int pix){
        int[] pt = new int[4];
        pt[0]= pix >> 24 & 0x000000FF;
        pt[1]= pix >> 16 & 0x000000FF;
        pt[2]= pix >> 8 & 0x000000FF;
        pt[3]= pix & 0x000000FF;
        return pt;
      }
      static int computePixel(int a, int r, int g, int b){
        return (((((a <<8)+ r) << 8) + g) <<8) + b;
      }
      static int computePixel(int[] pt){
        return (((((pt[0] <<8)+ pt[1]) << 8) + pt[2]) <<8) + pt[3];
      }
      static int alphaFromPix(int pix){
        return pix >> 24 & 0x000000FF;
      }
      static int redFromPix(int pix){
        return pix >> 16 & 0x000000FF;
      }
      static int greenFromPix(int pix){
        return pix >> 8 & 0x000000FF;
      }
      static int blueFromPix(int pix){
        return pix & 0x000000FF;
      }
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Super, on charge 2 fois l'image en entier pour connaitre sa taille

    Et la stacktrace ? Elle est où ? Je ne peux deviner que l"erreur vient bien de l'appel de ces méthodes, et qu'elle est dû au fait que le fichier n'est pas trouvé.

    Tu es sûr de ton path ? Ce serait pas plutôt "C:\\Users\\antoine\\Pictures\\Desktopimg\\Galaxy.jpg"
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    Re Salut,

    *)
    Super, on charge 2 fois l'image en entier pour connaitre sa taille
    Eh alors?Désolé je ne comprends pas ou est le problème,je ne suis qu'un débutant et je trouve ça plus rigoureux.

    *)
    Et la stacktrace ? Elle est où ? Je ne peux deviner que l"erreur vient bien de l'appel de ces méthodes, et qu'elle est dû au fait que le fichier n'est pas trouvé.
    Gné?Qu'est ce que le "strackTrace"

    *)
    Tu es sûr de ton path
    Oui je suis sur de mon path d'ailleurs si l'ordi ne le trouvé pas il me renverrait une erreur comme il l'a déjà fait non?

    En tout cas un grand merci à toi.

    EDIT1:Oui tu as raison dans mon code l'adresse de l'image est:"C:\\Users\\antoine\\Desktop\\imgGalaxy.jpg" j'ai du faire une erreur dans le copier coller dsl :/Je viens de corriger.

  6. #6
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut Presque solution
    Bonjour,

    *)
    Maintenant j'en suis persuadé le problème vient de "set bounds" en effet ce code marche parfaitement.
    Cependant et je le reprécise j'ai ABSOLUMENT besoin de pouvoir positionner mais images en "absolu" pas en "relatif".

    *)
    classe "image.java":

    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
    public class Image extends JPanel{
     
    	String adresseImg;
     
    	public JPanel fctAfficherImg(JPanel pan ,int posX ,int posY){
     
    		pan=new JPanel();//
    		Icon imgIcon=new ImageIcon(adresseImg);
     
    		JLabel imgJLabel = new JLabel ();//
    		imgJLabel.setIcon(imgIcon);
     
    		/*Pour faire le test
                    pan.setLayout(null);//positionement-mise en forme du JPanel
    		try {
    			pan.setBounds(posX,posY,ImageUtil.getImageHeight(adresseImg),ImageUtil.getImageWidth(adresseImg));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}*/
     
    		pan.add(imgJLabel,BorderLayout.CENTER);
     
    		return pan;
    	}
     
    }
    EDIT1:
    Je précise que mon code à légérement changé depuis le début essai personnel je poste donc aussi ma classe main actuelle:
    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
    public class Main extends JPanel {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		JFrame fenPrincipale=new JFrame("-ProjetNfa032-");//On definit la JFrame //fen=fenetre
            fenPrincipale.setSize(new Dimension(750,500));
            fenPrincipale.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            Image imgTest= new Image();
            imgTest.adresseImg="C:\\Users\\antoine\\Desktop\\imgGalaxy.jpg";
            JPanel panImgTest = null;
            panImgTest=imgTest.fctAfficherImg(panImgTest, 0, 0);
     
            fenPrincipale.add(panImgTest);
            fenPrincipale.setVisible(true);
     
    	}
     
    }

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message
    Re Salut,

    *)

    Eh alors?Désolé je ne comprends pas ou est le problème,je ne suis qu'un débutant et je trouve ça plus rigoureux.
    Plus rigoureux de faire 2 fois la même chose : je dirais plutôt 2 fois plus long moi. Là, si tu charges des petites images locales, ça va pas changer grand chose c'est sûr. Mais sur le principe, si tu as beaucoup d'images à charger à distance de poids conséquent chacune, ça pourrait pourrir les perfs : pour peu que tu les appels dans le thread graphique et souvent (ce que font la plupart des débutants), et tu vas avoir des blocages de ton ui (saccade, lag...).



    *)

    Gné?Qu'est ce que le "strackTrace"
    Ici, dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
    			pan.setBounds(posX,posY,ImageUtil.getImageHeight(adresseImg),ImageUtil.getImageWidth(adresseImg));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    Tu as mis un appel à la méthode printStackTRace() qui affiche la stack trace de l'exception : donc c'est le truc qui s'affiche lorsqu'il y a une exception, complet.


    *)
    Oui je suis sur de mon path d'ailleurs si l'ordi ne le trouvé pas il me renverrait une erreur comme il l'a déjà fait non?
    Tu as justement une erreur...


    En tout cas un grand merci à toi.

    EDIT1:Oui tu as raison dans mon code l'adresse de l'image est:"C:\\Users\\antoine\\Desktop\\imgGalaxy.jpg" j'ai du faire une erreur dans le copier coller dsl :/Je viens de corriger.
    Donc maintenant tu n'as pu cette exception et plus de stack trace qui s'affiche.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    @Joel Drigo//

    Merci pour tes réponses mais relis stp mon avant dernier message tt y est expliqué.(intitulé #Presque Solution c'est le numéro 6)
    Le "path" n'est pas mon probléme.Et je n'ai de toutes façons aucune erreurs qui s’affiche à la compilation.

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Un JPanel à un FlowLayout par défaut, donc imgJLabel s'affiche en flow dans dans pan, mais comme il est tout seul ça ne change pas grand chose. Tu pourrais tout aussi bien utiliser directement le JLabel.

    Le contentPane de la fenêtre lui a un BorderLayout par défaut : comme tu lui ajoutes un JPanel sans contrainte, il se place au centre, et donc s'étend dans tout l'espace. Mais un imageIcon ne s'étend jamais : il prend la taille de l'image au maximum, qui doit apparaître à priori en haut au centre (d'après les paramètres par défaut d'un FlowLayout.

    Soit il faut que tu supprimes tout layout du composant qui va contenir les images, et leur donner une position explicitement (setLocation(), ou une taille (setSize()), ou les deux (setBounds()), soit tu peux utiliser un AbsoluteLayout (code ici par exemple).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    @Joel Bigo//

    Soit il faut que tu supprimes tout layout du composant qui va contenir les images, et leur donner une position explicitement
    *)suppression des layout:
    N'est ce pas ce que je fais avec:
    *)Donner une position explicitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pan.setBounds(posX,posY,ImageUtil.getImageWidth(adresseImg),ImageUtil.getImageHeight(adresseImg));
    C'est ça non? le probléme c'est que ça ne marche pas!

    PS:Je viens de jeter un coup d'oeil attentif au lien le problème est que je ne vois pas ou est mon erreur.

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message
    Inutile de rappeler mon nom (ou si tu le fais, évite de l'écorcher )

    Citation Envoyé par Pif_Paf_Pouf Voir le message
    *)suppression des layout:
    N'est ce pas ce que je fais avec:
    bah déjà dans ton dernier code, cette ligne est commenté. Et tu ne fais pas ça sur le contentPane de la frame, qui lui aussi à un layout.

    Citation Envoyé par Pif_Paf_Pouf Voir le message

    *)Donner une position explicitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pan.setBounds(posX,posY,ImageUtil.getImageWidth(adresseImg),ImageUtil.getImageHeight(adresseImg));
    ça aussi tu la commenté dans ton dernier code.

    *)Donner une position explicitement:

    C'est ça non? le probléme c'est que ça ne marche pas![/QUOTE]

    "ça marche pas" ça veut tout et rien dire. Que se passe-t-il ou que ne se passe-t-il pas ? Si ton image n'est pas visible, quand tu as supprimé le layout, c'est probablement que du fait qu'il n'y a plus de layout, il n'y a plus de preferred size, donc le borderlayout du content pane n'affiche rien.

    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
    public class AbsoluteImagePanel extends JPanel {
     
    	public AbsoluteImagePanel() {
    		super();
    		setLayout(null);
    	}
     
    	public void addImage(Image image, int x, int y, int width, int height) {
    		JLabel label = new JLabel(new ImageIcon(image));
    		label.setBounds(x, y, width, height);
    		add(label);
    		setComponentZOrder(label, 0); // pour que le dernier s'affiche au dessus
    	}
     
    	public static void main(String[] args) throws IOException {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		final AbsoluteImagePanel panel = new AbsoluteImagePanel();
    		frame.getContentPane().add(panel);
     
    		final Random random = new Random();
    		final Image image = ImageIO.read(new File("suricate.png"));
     
    		for(int i=0; i<10; i++) {
    			addImage( panel, image, random  );
    		}
     
    		panel.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mousePressed(MouseEvent e) {
    				addImage( panel , image, random );
    				panel.repaint();
    			}
     
    		});
     
    		frame.setSize(300, 200);
    		frame.setLocationRelativeTo(null);
     
    		frame.setVisible(true);
    	}
     
    	private static void addImage(AbsoluteImagePanel panel, Image image, Random random) {
    		int x = random.nextInt(200);
    		int y = random.nextInt(150);
    		int width = 10 + random.nextInt(90);
    		int height = 10 + random.nextInt(90);
    		panel.addImage(image, x, y, width, height);
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    *)
    Désolé pour le nom

    *)
    Ce qui ce passe c'est que je n'ai pas d'erreur une fenetre s'ouvre mais sans image...voila c'est aussi simple que ça.

    *)
    Etant donné que le probléme vient de ce bout de code .Ne pourrais tu pas me donner la correction?sincérement voila 2h15que je ss sur ce problème et j'en ai marre!

    *)
    Si ton image n'est pas visible, quand tu as supprimé le layout, c'est probablement que du fait qu'il n'y a plus de layout, il n'y a plus de preferred size, donc le borderlayout du content pane n'affiche rien.
    alors comment faire pour que ce ne soit plus le cas?Il me semble que "setbounds()" aurait du régler ce probléme,non?

    Merci à toi en tout cas.

    PS:ce que j'ai mis en commentaire ds mon dernier code c'était uniquement pour le test.

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message

    alors comment faire pour que ce ne soit plus le cas?Il me semble que "setbounds()" aurait du régler ce probléme,non?
    Non, parce que tu affectes des bounds explicitement à un panel (pan) que tu mets dans le content pane qui a un BorderLayout : donc le setBounds() n'a aucun effet. Par contre, tu ajoutes le JLabel dans un JPanel à qui tu as supprimé le layout manager, donc le jlabel prend la taille par défaut et c'est tout : soit 0,0.
    C'est sur imgJLabel que tu devrais faire le setBounds (accessoirement, je lis la taille de l'ImageIcon ce qui m'évite d'avoir à recharger l'image 2 fois de plus pour connaitre sa taille) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imgJLabel.setBounds(posX,posY, imgIcon.getIconWidth(), imgIcon.getIconHeight());
    Ce que je te montre dans le code que je t'ai mis. Par contre, moi je ne créé qu'un seul panel sans layout, et pas un panel pour chaque image. Parce que dans ton cas, tu ne pourras mettre qu'une seul image dans le centre de la fenêtre et c'est tout (en fait tu pourras malheureusement en mettre plusieurs, mais une seule sera correctement loyauté et les autres vont trainer et leur layout sera foireux (car un BorderLayout ne peux layoutet qu'un seul composant dans chacune de ses zones).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    J'ai déjà éssayé cette solution et ça ne marche pas.

    L'image s'affiche correctement mais à une position par défaut ,cad au centre.

    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
    public class Image extends JPanel{
     
    	String adresseImg;
     
    	public JPanel fctAfficherImg(JPanel pan ,int posX ,int posY){
     
    		pan=new JPanel();//
    		Icon imgIcon=new ImageIcon(adresseImg);
     
    		JLabel imgJLabel = new JLabel ();//
    		imgJLabel.setIcon(imgIcon);
    		imgJLabel.setLayout(null);//positionement-mise en forme du JPanel
    		try {
    			imgJLabel.setBounds(posX,posY,ImageUtil.getImageWidth(adresseImg),ImageUtil.getImageHeight(adresseImg));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		pan.add(imgJLabel);
     
    		return pan;
    	}
     
    }
    *)
    Ce que je te montre dans le code que je t'ai mis. Par contre, moi je ne créé qu'un seul panel sans layout, et pas un panel pour chaque image. Parce que dans ton cas, tu ne pourras mettre qu'une seul image dans le centre de la fenêtre et c'est tout (en fait tu pourras malheureusement en mettre plusieurs, mais une seule sera correctement loyauté et les autres vont trainer et leur layout sera foireux (car un BorderLayout ne peux layoutet qu'un seul composant dans chacune de ses zones).
    De toutes façons TOUTES mes images seront en position absolues ... c'est bien ce que j'essaye depuis le début.

  15. #15
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    J'ai aussi essayé ainsi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		pan.setLayout(null);//positionement-mise en forme du JPanel
    		pan.setSize(100, 100);//ImageUtil.getImageWidth(adresseImg),ImageUtil.getImageHeight(adresseImg)
    		pan.setLocation(posX,posY);

  16. #16
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    Probléme résolu voici le code final:

    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
    public class Image extends JPanel{
     
    	String adresseImg;
     
    	public JPanel fctAfficherImg(JPanel pan ,int posX ,int posY){
     
    		pan=new JPanel();//
     
    		Icon imgIcon=new ImageIcon(adresseImg);//
    		JLabel imgJLabel = new JLabel ();
    		imgJLabel.setIcon(imgIcon);
     
    		pan.add(imgJLabel);
     
    		pan.setLayout(null);//positionement-mise en forme du JPanel
    		try {
    			imgJLabel.setSize(ImageUtil.getImageWidth(adresseImg), ImageUtil.getImageHeight(adresseImg));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		imgJLabel.setLocation(posX,posY);
     
    		return pan;
    	}
     
    }
    Cependant joel peux tu re préciser quelles sont les limites de cette méthode je ne les ai pas trés bien comprises,merci

  17. #17
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message
    J'ai déjà éssayé cette solution et ça ne marche pas.

    L'image s'affiche correctement mais à une position par défaut ,cad au centre.
    Cela fonctionne, en tout cas quand moi je teste ton code avec mes modifications (que je t'ai données). Il y a autre chose de modifié ailleurs.

    D'ailleurs tes dernières modifications qui fonctionnent d'après toi font exactement la même chose que moi, mais en 2 appels au lieu d'un (setLocation et setSize au lieu de setBounds). L'ordre d'appel différent ne change rien par ailleurs.



    Citation Envoyé par Pif_Paf_Pouf Voir le message
    De toutes façons TOUTES mes images seront en position absolues ... c'est bien ce que j'essaye depuis le début.
    Tu ne pourras pas mettre plusieurs images ! Il te faut qu'un seul panel sans layout manager (voir le code (ma version) que je t'ai donné), dans lequel tu mets toutes tes images, pas plusieurs panels que tu mets directement dans le content pane.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  18. #18
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    Il me faut donc un seul "Jpanel" mais plusieurs "Jlabel" ,un JLabel pour chaque image?

    Dans ce cas comment positionner en "absolu" la position des JLabel?

    Merci à toi

  19. #19
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Pif_Paf_Pouf Voir le message

    Cependant joel peux tu re préciser quelles sont les limites de cette méthode je ne les ai pas trés bien comprises,merci
    Quoi ? Tu parles du fait de charger plusieurs fois le même fichier image. C'est pourtant évident : les accès disques sont beaucoup plus lents que les accès mémoire. En plus, l'affichage se fait dans un thread dédié à l'affichage et au traitement des évènements d'UI : tout ce qu'on y fait bloque en particulier l'affichage. Si on y charge des fichiers, ceci bloque inutilement le rafraîchissement de l'affichage. Sans parler du chargement en mémoire de toutes ces images (combien on va en ajouter à la fenêtre, à quelle fréquence ?), qui ne seront traitées par le GC que lorsque nécessaire, ce qui causera un petit ralentissement de plus à ce moment. C'est quand même dommage de ne pas profiter de l'image qu'on a en mémoire surtout que ça ne coûte rien en complexité : on l'a sous la main dans le code,une ou 2 lignes juste avant dans le block : ce n'est pas comme si on devait écrire un code hyper compliqué pour gagné 20 ms.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  20. #20
    Membre actif
    Homme Profil pro
    :-)
    Inscrit en
    Mars 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : :-)
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2014
    Messages : 194
    Points : 204
    Points
    204
    Par défaut
    @Joel//

    Non je ne parlais pas de ça mais mtn je n'arrive pas à afficher plusieurs images en mm temps (images fixes).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Afficher une image dans un JLabel depuis une URL
    Par Morby dans le forum Débuter
    Réponses: 13
    Dernier message: 14/01/2012, 10h37
  2. Afficher une image dans un JLabel
    Par asoka13 dans le forum Applets
    Réponses: 4
    Dernier message: 07/11/2009, 02h05
  3. Afficher une image dans un état
    Par Invité1 dans le forum IHM
    Réponses: 8
    Dernier message: 23/09/2009, 14h59
  4. Afficher une image dans un état
    Par louis_figos dans le forum IHM
    Réponses: 5
    Dernier message: 09/03/2006, 11h09
  5. Besoin d'aide pour afficher une image dans un applet
    Par argon dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 19/01/2006, 19h45

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