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 :

[debutant] Afficher une image


Sujet :

2D Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Par défaut [debutant] Afficher une image
    Bonjour a tous,
    je debute en JAVA, et je n'arrive pas a afficher une image sur un composant.

    J'ai tiré de la FAQ les methodes suivantes, dans la methode Paint de mon composant swing :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	public void paintComponent(Graphics g_arg){
     
    		java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
    		Image image = toolkit.getImage("./toto.jpg");	
     
    		g_arg.drawImage(image,0,0,null);
    	}
    or, rien ne s'affiche a l'ecran, pourtant si a cet endroit precis, je demande le tracage d'un cercle, il s'affiche sans aucun probleme.

    Qu'ai-je fait de travers ?

    merci a vous.

    HopeLeaves

  2. #2
    Membre chevronné
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Par défaut
    Hello.
    Il est possible que ton image ne soit pas chargée au moment où tu veux l'afficher, car le chargement se fait dans un Thread séparé.

    Pour remédier à ça, utilise (par exemple) un ImageIcon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ImageIcon icon = new ImageIcon(image);
    image = icon.getImage();
    ... à rajouter avant ton drawImage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Par défaut ha bha non...
    j'ai essayer ce que tu as dit,
    j'ai meme essayé le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	public void paintComponent(Graphics g_arg){
     
    		ImageIcon icon = new ImageIcon(".\toto.jpg");
    		Image image = icon.getImage();
     
    		g_arg.drawImage(image,0,0,null);
    	}
    Puisque le constructeur de ImageIcon accepte de prendre un nom de fichier... mais rien ne s'affiche....

    ca doit surement etre un truc completement con...

    merci quand meme.

  4. #4
    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
    Apparement Java n'arrive pas à trouver limage utilisee par 'icone : le chemin n'est pas bon. Si tu utilises un \ il faut le doubler \\ sinon ".\toto.jpg" sera interprété comme ".<tabulation>oto.jpg".

    Ensuite fais bien attention à éviter de mettre en dur des chemins avec des \ dans ton code, car cela ne fonctionne que sous Windows.
    Tu peux récupérer le séparateur de fichier de la platforme actuelle en faisant System.getProperty("file.separator").

    Pour finir même si c'est bon pour un test : ne charge pas l'icone dans la méthode paintComponent, en effet une nouvelle icone serait créée à chaque repeinture de l'interface.
    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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Par défaut still not ....
    bon je renonce a comprendre ce qui ne marche pas .... tant pis, je ferai autrement.

    merci a tous en tout cas.

  6. #6
    Membre éclairé Avatar de ixterm
    Inscrit en
    Mars 2005
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 283
    Par défaut
    Tu as mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_arg.drawImage(image,0,0,null);

    ne mets pas "null" mais "this" comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_arg.drawImage(image,0,0,this);

    et également JPG en majuscule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Image image = toolkit.getImage("toto.JPG");

  7. #7
    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
    ne mets pas "null" mais "this" comme ceci
    Tu peux mettre null. Je ne passe jamais this et ca marche tres bien si l'image est chargee.

    et également JPG en majuscule
    Sous Windows cela ne changera rien.

    Ensuite fais bien attention à éviter de mettre en dur des chemins avec des \ dans ton code, car cela ne fonctionne que sous Windows.
    Je devrais verifier mais je suis a peu pres certain que cela marchera sous Linux, Solaris et MacOS X avec un \\. Les / marchent par exemple tres bien sous Windows dans du code Java. La classe File est suffisamment intelligente pour utiliser le separateur correct elle-meme. C'est pour cela que j'utilise toujours /, cela evite de passer par File.separator ou d'echapper le \ en \\.

  8. #8
    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
    ne mets pas "null" mais "this" comme ceci :
    En général c'est inutile, mais bon si ton image est longue à charger ou se trouve à l'autre bout d'Internet, ca peut influencer. A ce moment-là il faudra peut-être provoquer un repaint() lorsque la méthode appropriée de ImageObserver est appelée (ce qui est peut-être le comportement par défaut - perso je met 100% du temps null).

    et également JPG en majuscule
    Encore faudrait-il que le fichier soit nommé de cette manière. De toute facon Windows se contrefiche éperdument de la casse en temps normal.
    Attention cependant si tu veux que ton programme soit portable alors oui il faudra faire attention à la casse (et au séparateur de fichier comme indiqué plus haut), et écrire le nom de ton fichier exacterment tel qu'il est réellement (avec les majuscules et les minuscules au bon endroit). En effet les systèmes de type Unix eux font la différence.

    Il semble plus logique que le chemin ne soit pas bon puisque l'image retournée par ImageIcon semble vide.

    EDIT - zut encore grillé

    EDIT 2 - décidement...
    J'ai toujours mis / dans mon code Java pour les sépérateur de chemin sous Linux/Windows/Solaris/MacOS et pour l'acces aux JAR.
    Dans mes souvenirs des tests de Java 1.1.2 et/ou 1.1..5 sous Solaris le \\ne fonctionnait pas. Mais c'était il y a fort longtempts et ou je m'y prenais mal à l'époque (c'est possible je débutais) ou le comportement de la JVM a changé depuis.
    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

  9. #9
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 10
    Par défaut
    Un petit truc en plus: utiliser un MediaTracker.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MediaTracker tracker = new MediaTracker(this);
     
    Image img = ....
    tracker.addImage(img, 0);
     
    Image img2=...
    tracker.addImage(img2, 1);
     
    ...
     
    try{
    tracker.waitForAll(); }
    catch(InterruptedException e){}

    Le but est de bloquer l'execution du programme tant que les images n'ont pas été effectivement chargées.


    Maintenant, je te conseillerai plutot de charger l'image dans le constructeur plutot que dans la méthode paintComponent.
    Sinon, a chaque fois que la méthode sera appelée (déplacement fenetre, maximisation, minimisation, changement de taille, ...), tu fais recharger l'image.

    Maintenant, je n'émets qu'un avis de débutant

  10. #10
    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
    Mieux que le MediaTracker, ImageIO

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Par défaut ha bha ouais, c mieu
    bien merci a vous tous.
    le mediaTracker etait donc la solution a mon probleme.

    j'ignore si le ImageIO est mieu encore, mais en tous ca mon image s'affiche... alors merci, pb resolu.

    HopeLeaves

  12. #12
    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
    Ben quand tu fais juste ImageIO.read(tonFichier) il fait tout le boulot du MediaTracker pour toi.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Par défaut Enfin presque....
    Voici donc mon nouveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public void paint(Graphics g_arg){
     
    		try {
    			BufferedImage image = ImageIO.read(new File("c:/toto.jpg"));
    			g_arg.drawImage(image,0,0,this);
     
    		} catch
    		(IOException e){/*...*/}		
    	}
    Mais voila, comme ca ca marche, mais si je remplace le chemin de l'image par './toto.jpg' ou simplement 'toto.jpg', ca marche plus.

    le fichier est a la fois sous c:/ et dans le dossier où est le fichier .java de ma classe.

  14. #14
    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
    Il faut qu'il soit dans le dossier qui contient le .class, pas le .java. Et il ne faut pas charger l'image dans la methode paint

  15. #15
    Membre éclairé Avatar de ixterm
    Inscrit en
    Mars 2005
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 283
    Par défaut
    Oui pourla portabilité, il faut bien mettre .JPG. En effet en faisant un "dir" sous dos on s'aperçoit que même si on renomme toto.JPG en toto.jpg,le JPG reste en majuscule

    C'est surtout avant créer un jar executable que cela est important

  16. #16
    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
    Ton systeme n'est pas le mien (... ou le sien) : par exemple sur mes Windows XP ici au boulot, ou chez moi toutes mes extensions de fichiers sont toujours en minuscules (comportement par defaut), comme quoi. Alors certes la (sur Windows) il ne fera pas la difference d'entre .JPG et .jpg ou .Jpg, .jpG,.... Pourtant sur mon Linux je peux t'assurer que si tu tapes monfichier.JPG il n'arrivera pas a l'ouvrir. Sans compter que dans le meme repertoire je pourrai sans probleme avoir des fichiers (voir des repertoires) avec des noms identiques mais des combinaison de casse differente...

    Pour revenir au sujet et comme dit precedement : il lui faut donc mettre le nom du fichier tel qu'il est reellement (sur sa machine)*.
    ... et faire des tests sur d'autres platformes (toujours faire des tests de toute maniere)

    *Tu notteras que je ne lui dit pas de ne pas ecrire .JPG. Si le fichier a cette ecriture alors c'est celle-la qu'il faut utiliser.

    [HS]
    ...des extensions en majuscule par defaut, .... hum ca me dit qq chose... tu n'aurais pas Windows Advanced Server 2003 ou une beta de Vista par hasard ?! Ou au contraire une version plus ancienne basee sur DOS style 95 ou 98 ?
    [/HS]
    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

  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
    Non, c'est faux. Tout simplement parce que Windows se fiche de la casse et que sous les systemes qui s'en preoccupent (Solaris, MacOS X, Linux...) les extensions ne sont pour ainsi dire jamais en majuscules.

    Ooops, battu par bouye

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

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. Debutant afficher une Image dans un panel
    Par jejermoa dans le forum Graphisme
    Réponses: 5
    Dernier message: 21/03/2008, 11h35
  3. [debutant]Afficher une image en choisissant ses dimensions
    Par Romain93 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 13/11/2006, 03h19
  4. [DEBUTANT] afficher une image
    Par guiguistuder dans le forum Débuter
    Réponses: 5
    Dernier message: 29/10/2006, 13h39
  5. [debutant] afficher une image...
    Par loic_86 dans le forum 2D
    Réponses: 3
    Dernier message: 11/01/2006, 23h33

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