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

2D Java Discussion :

Affichage d'une image


Sujet :

2D Java

  1. #1
    Membre confirmé Avatar de Ndugu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 121
    Par défaut Affichage d'une image
    Bonjour à tous,

    je suis débutant en java et je m'excuse d'avance pour ce post...

    Cela fait deux jour que je tente d'afficher une image sur une fenêtre, mais malgré mais recherche sur la fac et les forums, je ne comprend pas pourquoi mon image ne s'affiche pas!?

    La fenêtre s'ouvre mais l'image ne s'affiche pas.

    Voici mon code :
    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
    package essai;
    
    import javax.swing.JFrame;
    
    import java.awt.Image;
    import java.awt.Graphics;
    
    public class CircleFrame extends JFrame  {
    
    	private Image Img;
    	
    	/**  Le constructeur de la classe CircleFrame */
    	public CircleFrame() {
    		
    		this.setVisible(true);
    		this.setSize(800,500);
    
    		/** Accès au toolkit : */
    		java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
    		/** lecture de l'image : */
    		Img = toolkit.getImage("foot.gif");
    	}
    	
    	/**	Point d'entree de notre programme. */
    	public static void main (String[] args){
    		/*instanciation classe*/
    		CircleFrame cF = new CircleFrame();
    		cF.repaint();
    	} 
    	
    	public void paint(Graphics g) {
    		// Affichage d'une image	
    		g.drawImage(Img,100,100,null);
    	}
    	
    }
    Précision : j'ai mis l'image "foot.gif" dans le dossier où se trouve la classe.

    Merci d'avance à celui ou celle qui pourra m'expliquer ce que je fais mal...

  2. #2
    Membre éclairé Avatar de trax44
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 300
    Par défaut
    essaye d'overwrite la methode repaint
    et pense a dire a ton composant de se repeindre justement
    this.repaint();

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    L'image ne doit pas être dessinnée sur la JFrame mais sur un JPanel(ou JComponent) que tu placera en tant que contentPane de ta JFrame

    Cf FAQ: http://java.developpez.com/faq/gui/?...E_fond_fenetre

  4. #4
    Membre éclairé Avatar de trax44
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 300
    Par défaut
    Je sentais que c'était pas propre mais quel est l'inconvénient de repeindre directement le composant ?

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tout simplement car la méthode paint de la JFrame est héritée du Container AWT. Or celui ci ne se prête pas du tout au dessin (la seule classe se prêtant au dessin dans AWT étant la classe Canvas)

  6. #6
    Membre confirmé Avatar de Ndugu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 121
    Par défaut
    Merci pour la rapidité de vos réponses, je vais essayer tout ca...

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Pour des questions de modularisation et de reutilisabilite de code egalement. Tu auras probablement plus souvent besoin d'un JPanel affichant une image que d'une JFrame. Or avoir le premier, permet de facilement faire le second d'une maniere plus "Swing-like" avec setContentPane().

    Note que la surcharge de paint() fonctionne cependant et c'est d'ailleurs une bonne maniere de faire des ecrans de demarrage/chargement avec des surcharge de JWindow par exemple (la methode pour avoir des splashscreens n'existant que depuis Java 6 et n'etant en fait pas terrible a l'usage).

    Sinon ton probleme vient peut-etre de l'usage de Toolkit pour charger l'image. En effet Toolkit charge des images de maniere asynchrone (une image vide est retournee, une notification est lancee via le mecanisme de l'ImageObserver lorsqu'elle est chargee permettant de forcer un repaint()). Ainsi ton image n'est peut-etre pas chargee (voir meme peut-etre pas trouvee par le programme) au moment ou la fenetre s'affiche.

    Pour charger de maniere synchrone (ca bloque tant que l'image n'est pas entierement chargee), tu peux utiliser ImageIO ou une ImageIcon. Cela te permettra egalement de voir si ton image est trouvee par ton application.
    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

  8. #8
    Membre confirmé Avatar de Ndugu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 121
    Par défaut
    Merci bouye pour ces précisions trés intéressantes, je travail toujours sur mon problème...

    Je ne manquerais pas de mettre un code valide pour les autres débutant comme moi, mais je n'ai toujours pas résolu mon problème.

  9. #9
    Membre confirmé Avatar de Ndugu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 121
    Par défaut
    Bonsoir à tous,

    je ne comprend pas, quelque soit le code que je récupère aucun ne marche. Toujours le même résultat : La fenêtre s'affiche mais pas l'image. Meme le code téléchargé dans la FAC! J'ai due essayer avec 5 ou 6 codes différents.

    Je travail avec éclipse (la dernière version stable), Je pense qu'il doit avoir une manip, ou une configuration toute simple que je ne doit pas faire. Je suis perdu!

    voici le dernier code que j'ai testé :
    (il me parait pourtant simple et juste...)

    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
     
    package pac4;
     
    import javax.swing.*;
     
    class MonImage extends JFrame{  
     
      MonImage(String s){
        setContentPane(new Affiche(s));
      }
     
      public static void main(String[] argv){
     
        MonImage monCadre = new MonImage("foot.gif");
        monCadre.pack();
        monCadre.setVisible(true);
      }
    }
     
    ----------------------------------------------------------
     
    package pac4;
     
    import javax.swing.*;
    import java.awt.*;
     
    class Affiche extends JPanel{
     
      Image IMG;
     
      Affiche(String s){
          IMG = getToolkit().getImage(s);
          setPreferredSize(new Dimension(300, 200));
      }
     
      public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(IMG, 0, 0, this);
      }
    }
    La fenêtre s'affiche, mais toujours pas d'image!


    Je n'ai pas encore essayé ImageIO comme me l'a conseillé bouye, ce que je vais faire, mais comme tous les cites java propose plus ou moins le meme code pour afficher une image, je dois certainement oublier une chose importante...

    C'est bien avec les fichiers de classes qu'il faut mettre l'image? (j'ai également essayer "c:\foot.gif" pour le meme résultat)

    N'étant pas débutant en C++, comprenez ma frustration de bloquer sur un simple affichage d'image

    Merci pour vos conseils.

    Ndugu

  10. #10
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Ndugu
    ... j'ai également essayer pour le meme résultat)
    Moi, avec ce code, sous NetBeans, je me fais jeter. il faut que je double le "\" , cela conduit à :
    C'est peut-être une piste.

    Cordialement.

    Pierre

  11. #11
    Membre confirmé Avatar de Ndugu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 121
    Par défaut
    ChPr...

    ...

    ... Merci

    En plus c'est pareil sous certaint EDI c++


    Comment perdre trois jours de prog, leçon1-chapitre1 : Lire ce post depuis le début.

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Aucun probleme pour moi ca s'affiche instantanement meme avec Toolkit sur une image de test. Donc je pense que ton programme ne trouve pas ton image (et donc que le proxy retourne par Toolkit reste desesperement vide).

    Tu verras le flag ERROR a true dans ce cas si tu rajoutes ce code a la classe Affiche :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      /**
       * {@inheritDoc}
       */
      @Override public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
        System.out.println("===============================================================");
        System.out.println("WIDTH :" + ((infoflags & WIDTH) == WIDTH));
        System.out.println("HEIGHT :" + ((infoflags & HEIGHT) == HEIGHT));
        System.out.println("PROPERTIES :" + ((infoflags & PROPERTIES) == PROPERTIES));
        System.out.println("SOMEBITS :" + ((infoflags & SOMEBITS) == SOMEBITS));
        System.out.println("FRAMEBITS :" + ((infoflags & FRAMEBITS) == FRAMEBITS));
        System.out.println("ALLBITS :" + ((infoflags & ALLBITS) == ALLBITS));
        System.out.println("ERROR :" + ((infoflags & ERROR) == ERROR));
        System.out.println("ABORT :" + ((infoflags & ABORT) == ABORT));
        return super.imageUpdate(img, infoflags, x, y, width, height);
      }

    PS : ces methodes sont courrament decrites car elles existent depuis Java 1.0~1.1 mais depuis on fait mieux et bien plus rapide. Toolkit n'est vraiment pas recommande pour le chargement des images. Si tu a vraiment besoin d'un chargement asynchrone va voir du cote de MediaTracker. Dans la majorite des cas, preferres les chargements synchrones (sauf si tes images font 5Mo+), c'est egalement, en general, plus facile de detecter les erreurs avec ceux-ci.
    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

  13. #13
    Membre confirmé Avatar de Ndugu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 121
    Par défaut
    J'ai tout de meme essayé avec imageIO et ca marche également (logique). Meme classe que sur mon dernier post, avec comme constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Affiche(String s){
     
    	try {
    	    // Read from a file
    	    File file = new File(s);
    	    IMG = ImageIO.read(file);
     
    	} catch (IOException e) {
    	}
     
        setPreferredSize(new Dimension(300, 200));
      }
    Et biensur "c:\\MonImage.gif" comme chemin de fichier!

    Merci à tous pour vos conseils et votre temps,
    j'ai l'impression de me retrouver 5 ans en arrière lorsque j'ai commencé le C++.

    Merci encore,

    Ndugu

  14. #14
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    De rien.

    J'ai rajoute quelques notes en fin de mon precedent message pendant que tu postais.
    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

  15. #15
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Tout simplement car la méthode paint de la JFrame est héritée du Container AWT. Or celui ci ne se prête pas du tout au dessin (la seule classe se prêtant au dessin dans AWT étant la classe Canvas)
    Pas du tout. C'est parce que Swing fait des choses en plus dans paint() (double-buffering, dessin des bordures, dessin des enfants des conteneurs, etc.). La surcharge de paintComponent() permet de s'assurer que tout continue à se comporter correctement.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Citation Envoyé par Gfx
    Pas du tout. C'est parce que Swing fait des choses en plus dans paint() (double-buffering, dessin des bordures, dessin des enfants des conteneurs, etc.). La surcharge de paintComponent() permet de s'assurer que tout continue à se comporter correctement.
    Le paint en question était celui de la JFrame et non celui d'un JComponent. Et à base NGudu utilisait une JFrame pour essayer de dessiner son image

    (en ce qui concerne le paint/paintComponent d'un JComponent je le sais bien)

  17. #17
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Ce n'est certes pas une bonne pratique mais ton explication est erronnée (surtout que JPanel, JComponent, etc. héritent aussi de java.awt.Container .

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bon d'accord j'arrête ma mauvaise foi ici ^^

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

Discussions similaires

  1. [Tomcat] Affichage d'une image
    Par david71 dans le forum Tomcat et TomEE
    Réponses: 8
    Dernier message: 15/02/2005, 11h37
  2. Réponses: 2
    Dernier message: 27/12/2004, 09h23
  3. Pbs d'affichage d'une image sur un panel
    Par ysr1 dans le forum C++Builder
    Réponses: 2
    Dernier message: 23/09/2004, 09h55
  4. [FLASH MX] Qualité d'affichage d'une image
    Par n_tony dans le forum Flash
    Réponses: 3
    Dernier message: 16/08/2004, 09h44
  5. Affichage d'une image sous linux
    Par Braim dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 25/03/2003, 10h41

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