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

Graphisme Java Discussion :

probleme de cast pour afficher une image


Sujet :

Graphisme Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut probleme de cast pour afficher une image
    bonjour,
    alors déjà je ne savais pas si c'est le bon endroit pour ce post alors désolé si ça ne l'est pas.
    Petite présentation de mon programme:
    Mon but est de faire un jeu de type mémo où le but est de trouver les paires d'images. J'ai donc une classe Surface qui hérite de Canvas qui sert de support à tous les éléments qui vont être affichés (boutons, rectangles, textes, images...).
    Et j'ai ma classe Cards dont le but sera d'affecter divers variables notamment le lieu où se trouve l'image (car l'utilisateur pourra choisir quelles images il voudra utiliser et elles seront sauvegardées et lues via FileWriter et File Reader); cette classe contient une méthode paint dont le but est évidament d'afficher l'image sur la surface en question. Après un probléme d'ImageObserver résolu, mon programme ne veut pas se compiler alors que Netbeans ne me détecte pas d'erreurs.
    Je préfére mettre ici mes classes Surface et Cards afin que vous puissiez mieux voir:
    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
    public class Surface extends Canvas{
       
        public Surface(int width, int height) {
            vector= new Vector();
            vector2= new Vector();
            setSize(width, height);
        }
       
        public void paint(Graphics graphics){
            for(int i=0; i<vector.size(); i++){
                ((Shape)vector.get(i)).paint(graphics);
            }
            ((Cards)vector2.get(0)).paint(graphics);
        }
       
        public void add(Shape data){
            vector.add(data);
            repaint();
        }
       
        public void add(Image img){
            vector2.add(img);
            repaint();
        }
        public void remove(Shape shape){
            vector.remove(shape);
        }
       
       
        private java.util.Vector vector = null;
        private java.util.Vector vector2 = null;
    }
    
    public class Cards {
        public Cards(Surface surface){
           java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
           Image image= toolkit.getImage("PJ-echelle.gif");
           surface.add(image);
        }
       
        public void paint(Graphics graphics){
            graphics.drawImage(image, 200, 400,null);
        }
        private Image image=null;
    }
    L'erreur est alors la suivante:
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to graphic.Cards
    qui si je comprends bien dit qu'il ne peut pas caster en Cards un ToolkitImage.
    NB: la classe Cards n'est pas finie j'essayer juste d'afficher une image donnée pour voir si ça marche...

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut a moitie coriigé
    bonjour,
    j'ai a moitié corrigé à savoir que je n'ai aucune erreur mais mon image ne s'affiche pas...
    pour cela j'ai modifier la classe Cards pour la mettre comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Cards {
        public Cards(String str){
           java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();//ligne obligatoire pour charger
           Image img= toolkit.getImage(str);//on charge l'image depuis str
           this.image=img;
        }
        
        public void paint(Graphics graphics){
            graphics.drawImage(image, 200, 400,null);
        }
        public Image image=null;
    }
    et j'ai changer la méthode de Surface add comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public void add(Cards cards){
            vector2.add(cards);
            repaint();
        }
    Donc il ne reste qu'a afficher cette image....

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Il n'est pas recommande d'utiliser ToolKit pour charger des images asynchrone sans controler le tout via un ImageObserver. Pour un chargement directe/synchrone/bloquant, utilise plutot ImageIO a la place.
    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

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut je vais voir...
    ok merci j'avais trouvé ça sur internet et dans un livre que j'ai mais je vais voir avec imagIO en rentrant chez moi...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut toujours pas
    alors là j'y suis presque....enfin...
    déjà je me suis rendu compte que je ne mettait pas les images au bon endroits... maintenant je n'arrive à afficher qu'une seule image:
    j'ai d'abord trouvé une méthode pour changer le logo de la fenêtre et ça marche très bien du coup j'ai fais copié collé sans même changer le nom du fichier et tout marche...
    sauf que quand j'essaie de mettre une autre image, ça ne marche plus, pourtant j'ai tout essayé taille, type, nom ...
    j'utilise la méthode drawImage de java.awt.....
    bizarre non?

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Code ?
    Dire que ca ne marche pas c'est bien trop vague ! Il y a des exceptions ? Rien ne s'affiche ? ...
    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

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    euh oui désolé en fait je peux afficher n'importe qu'elle image en icone de la fenêtre mais dans mon canvas elle ne s'affiche que si c'est la même que cette icone... mais je n'ai pas d'erreur de compilation...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 graphic;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Vector;
    
    public class Test extends Frame{
        
        public Test() {   
            initComponents();
        }
        
        public static void main(String[] args) {
            Test test = new Test();
            test.pack();
            test.setVisible(true);
        }
        private void initComponents(){
            Panel panel = new Panel();
            Surface surface = new Surface(800,600);
            setTitle("c'est bon pour la mémoire...c'est bon bon");
            Image icone = Toolkit.getDefaultToolkit().getImage("pictures/duke.jpg");
            setIconImage(icone);
    
            addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e) {System.exit(0);}
            });
            
            panel.add(surface);
            add("Center",panel);
            
            Cards c=new Cards();
            surface.add(c);
            
        }
        
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package graphic;
    import java.awt.*;
    public class Cards{    
        public void paint(Graphics graphics){
            Image img= Toolkit.getDefaultToolkit().getImage("pictures/coupe_cerveau.jpg");
            graphics.drawImage(img,50,50,null);
        }
    }
    el la classe surface qui sert juste d'intermédiaire:
    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
     
    package graphic;
    import java.awt.*;
    import java.util.*;
     
    public class Surface extends Canvas{
     
        /** Creates a new instance of Surface */
        public Surface(int width, int height) {
            vector2= new Vector();
            setSize(width, height);
        }
     
        public void paint(Graphics graphics){
            ((Cards)vector2.get(0)).paint(graphics);
     
        public void add(Cards cards){
            vector2.add(cards);
            repaint();
        }
     
        private java.util.Vector vector2 = null;
    }

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il ne faut pas appeler "Image img= Toolkit.getDefaultToolkit().getImage("pictures/coupe_cerveau.jpg");" dans la méthode "paint". Créé une instance dans la construction de ton objet en utilisant javax.imagio.ImageIO.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    c'est bon ça marche!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    j'ai donc utilisé imageio comme vous m'avez dit et tout fonctionne, pourtant je trouve bizarre que l'erreur vienne juste du fait d'utiliser imageio plutôt que getimage(); pourquoi?

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Parce que, comme 99.99% des gens tu n'as pas bien lu la doc ou les exemples lies a cette methode qui date de Java 1.0 et sont lie au fonctionnement general de la classe Image.

    Cette methode fait un chargement asynchrone, c'est a dire non-bloquant/en arriere plan, elle retourne donc IMMEDIATEMENT une image VIDE qui sera remplie plus tard, il faut donc utiliser un ImageObserver pour se tenir au courant de l'etat du chargement et faire un reaffichage lorsque l'image a ete definitivement telechargee/chargee en memoire ou s'il y a eut, au contraire, une erreur lors du chargement, ce que tu ne fais pas.

    Generalement, on prefere les chargements synchrones (c-a-d bloquants, l'appel bloque tant que l'image n'est pas completement chargee en memoire et une erreur est directement retournee sous forme d'exception) qui sont liee aux mecanismes entourant la classe BufferedImage qui a ete introduite bien plus tard.

    Il arrive cependant (par exemple dans le cas d'applets) que l'on veille preferer le chargement asynchrone, dans ce cas il faut penser a utiliser ImageObserver.
    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

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

Discussions similaires

  1. [Débutant] QReport - Probleme pour affiché une image
    Par microbe83 dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/11/2012, 17h10
  2. probleme pour afficher une image dans une jsp
    Par jean-pierre69380 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 10/06/2012, 12h35
  3. [Base de donnée] BCB6 Probleme pour afficher une image dans un DBGrid
    Par o_live dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/12/2010, 10h07
  4. Réponses: 13
    Dernier message: 23/12/2004, 18h01
  5. Comment faire pour afficher une image ds une dbgrid
    Par totomaze dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/10/2004, 15h31

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