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 :

afficher image sur une case survolée


Sujet :

2D Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut afficher image sur une case survolée
    Bonjour à tous,
    je fais un petit jeu de dame et je voudrais afficher une image sur une case quand je la survole. Voici ce que j'ai fais :

    Dans le constructeur de ma classe qui gère l'affichage du damier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // pour afficher la case survolée
            addMouseListener(new MouseAdapter(){
                @Override
                public void mouseEntered(MouseEvent evenement) {
                    // TODO: Gérer l'affichage de la case survolée
                    survol(evenement.getPoint());
                }
            });
    Ensuite, la méthode survol(Point p) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Gère le survol des cases
        private void survol(Point p) {
            final int l = (Damier.TAILLE_PLATEAU - 1 - p.y / tailleCases);
            final int c =  p.x / tailleCases;
            // On dessine la position
            dessineSurvol(getGraphics(), l, c);
        }
    Et la méthode qui dessine l'image sur la case :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Dessine l'image de la case survolée
        private void dessineSurvol(Graphics g, int l, int c) {
            // calcule la position de son coin en haut à gauche
            int cPos = c * tailleCases; 
            int lPos = (Damier.TAILLE_PLATEAU - 1 - l) * tailleCases;
            // dessine la case survolée
            g.drawImage(caseSurvolee, cPos, lPos, this);
        }
    Mon problème n'est surement pas compliqué.
    En fait, quand je passe sur mon damier avec ma souris la première case survolée affiche bien l'image, et ensuite, il faut que je ressorte du JPanel (ma classe Damier étend JPanel) pour qu'il réaffiche l'image sur une autre case survolée, et ceci sans effacer la dernière.
    J'aimerais que lorsque je suis sur mon JPanel avec ma souris, à chaque fois que je survole une case, il m'affiche l'image, et tout ceci en supprimant l'image affichée sur la dernière case.

    Merci pour votre aide !

    P.S : Ce serait bien aussi qu'aucune image ne s'affiche quand je sort de mon JPanel avec ma souris.

  2. #2
    Membre habitué Avatar de cysboy
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 221
    Points : 168
    Points
    168
    Par défaut
    Salut,
    En redessinant ta case lors de l'événement mouseExited(MouseEvent e)...
    çà ne pourrais pas le faire ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    C'est une bonne idée mais je n'arrive pas à le faire
    Et celà ne suffira pas pour tout faire je pense.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    addMouseListener(new MouseAdapter(){
                @Override
                public void mouseExited(MouseEvent evenement) {
                   // Je met quoi ici ??
                }
            });

  4. #4
    Membre habitué
    Avatar de Grumphette
    Homme Profil pro
    Validation manager
    Inscrit en
    Juillet 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Validation manager

    Informations forums :
    Inscription : Juillet 2008
    Messages : 81
    Points : 192
    Points
    192
    Par défaut
    Le glass pane ne pourrais pas répondre à ta question? voir:http://java.sun.com/docs/books/tutor...html#glasspane

  5. #5
    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 : 43
    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 faut utiliser MouseMotionListener qui envoie un événement à chaque nouvelles coordonnées du pointeur.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Ah oui, mouseMotionListener, je viens de me rendre compte que je l'avais confondu avec mouseDragged. C'est pourquoi je ne l'ai pas utilisé.
    Mais du coup, est ce que je garde le mouseEntered ou non ?

  7. #7
    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 : 43
    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
    Citation Envoyé par womannosky Voir le message
    Ah oui, mouseMotionListener, je viens de me rendre compte que je l'avais confondu avec mouseDragged. C'est pourquoi je ne l'ai pas utilisé.
    Mais du coup, est ce que je garde le mouseEntered ou non ?
    Bien sûr ! Mais pas avec le même corps. Tu dois savoir quand le pointeur entre et sort de ton panel. Tu peux utiliser un booléen par exemple pour savoir si tu es à l'intérieur du panel. Dans les méthodes du MouseMotion, tu vérifies que le booléen est à true pour effectuer tes affichages.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Merci dinobogan, je regarde ça.

    Merci encore!

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Alors, maintenant, mon image s'affiche bien sur ma case quand je passe dessus mais les autres images sur les autres cases restent affichée, je ne vois pas comment faire pour les supprimer... Avez-vous des idées ??

    Voici mon code dans mon constructeur :
    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
     
    // pour afficher la case survolée
            addMouseListener(new MouseAdapter(){
                @Override
                public void mouseEntered(MouseEvent evenement) {
                    survol = true;
                }
            });
     
            // pour réafficher la case survolée
            addMouseListener(new MouseAdapter(){
                @Override
                public void mouseExited(MouseEvent evenement) {
                    survol = false;
                }
            });
     
            // TODO: Gérer l'affichage de la case survolée
            addMouseMotionListener(new MouseMotionAdapter(){
                @Override
                public void mouseMoved(MouseEvent evenement) {
                    survol(evenement.getPoint());
                }
            });
    Et mes deux méthodes :
    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
     
    // Gère le survol des cases
        private void survol(Point p) {
            final int l = (Damier.TAILLE_PLATEAU - 1 - p.y / tailleCases);
            final int c =  p.x / tailleCases;
            // On dessine la position
            if(survol == true) {
                dessineSurvol(getGraphics(), l, c);
            }
        }
     
        // Dessine l'image de la case survolée
        private void dessineSurvol(Graphics g, int l, int c) {
            // calcule la position de son coin en haut à gauche
            int cPos = c * tailleCases; 
            int lPos = (Damier.TAILLE_PLATEAU - 1 - l) * tailleCases;
            // dessine la case survolée
            g.drawImage(caseSurvolee, cPos, lPos, this);
        }

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Je viens de modifier ma méthode survol() comme ceci :
    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
     
    // Gère le survol des cases
        private void survol(Point p) {
            // On récupère la ligne et la colonne
            final int l = (Damier.TAILLE_PLATEAU - 1 - p.y / tailleCases);
            final int c =  p.x / tailleCases;
     
            if(dernierSurvol != null) {
                // on redessine la derniere case
                dessine(getGraphics(), dernierSurvol.ligne(),dernierSurvol.colonne());
                // on réinitialise la dernier survol à null
                dernierSurvol = null;
            } else {
                dernierSurvol = Position.nouvelle(l, c);
                // On dessine la position
                dessineSurvol(getGraphics(), l, c);
            }
        }
    Celà marche très bien à part que mon image clignotte
    En fait, ça affiche l'image à chaque fois que la souris bouge et moi j'aimerais que ça affiche l'image à chaque fois que la souris change de case.
    Je ne vois pas trop comment faire, quelqu'un a une idée ??
    Merci !

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    J'ai réussi !
    avec ce code là :
    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
    // Gère le survol des cases
        private void survol(Point p) {
            // On récupère la ligne et la colonne
            final int l = (Damier.TAILLE_PLATEAU - 1 - p.y / tailleCases);
            final int c =  p.x / tailleCases;
     
            // Si la dernière position n'est pas nulle et qu'elle n'est pas égale à la nouvelle
            if (dernierSurvol != null && !(dernierSurvol.equals(Position.nouvelle(l, c)))) {
                // on redessine la derniere case
                dessineSurvol(getGraphics(), dernierSurvol.ligne(), dernierSurvol.colonne());
                // on réinitialise la dernier survol à null
                dernierSurvol = null;
            } else {
                // On prend les coordonnées de la nouvelle case
                dernierSurvol = Position.nouvelle(l, c);
                // On dessine la position
                dessineSurvol(getGraphics(), l, c);
            }
        }

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

Discussions similaires

  1. Afficher image sur une page html via c
    Par Relyss dans le forum Réseau
    Réponses: 3
    Dernier message: 17/12/2009, 11h40
  2. [A-07] Afficher Image selon une case à cocher
    Par vinze60 dans le forum IHM
    Réponses: 10
    Dernier message: 21/10/2008, 10h11
  3. Attribut alt d'une image sur une case d'un tableau
    Par johnson95 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/09/2008, 15h31
  4. [débutant]Afficher une image sur une JFrame
    Par mavina dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 09/08/2006, 16h25
  5. Afficher des images sur une grille
    Par Coussati dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/10/2005, 09h27

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