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 :

Détecter une ellipse au passage de la souris [Débutant(e)]


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Par défaut Détecter une ellipse au passage de la souris
    Bonjour à tous,

    Je débute en graphisme sous Java. J'ai dessiné un ellipse dans un JPanel et je souhaiterais qu'elle se remplisse au survol de la souris et qu'elle se vide quand la souris n'est plus dessus. Cela implique de construire une ellipse qui pourra être détectée par la souris. Et là je sèche ... J'ai essayé mais sans résultats : j'ai créé une classe Ellipse implémentée par un MouseListener et je trace la figure grâce à un Graphics g.

    Donc, est-il possible de détecter une figure dessiné dans un JPanel?

    Et comment s'y prendre pour arriver à mes fins?

    Merci d'avance pour votre aide

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Dans ton panel, tu maintiens une liste des objets dessinés.
    Une ellipse peut-être définie par Ellipse2D.Float() ou par Ellipse2D.Double() et dessinée dans le panel via les méthodes Graphics2D.draw(Shape) ou Graphics2D.fill(Shape)
    Pour savoir si la souris est à l'intérieur de l'ellipse, il suffit d'appeler la méthode Shape.contains(double x, double y)
    Soit qq chose comme ça :
    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
    class MyPanel extends JPanel implements MouseInputListener {
     
      private List<Shape> shapes = new ArrayList<Shape>();
     
      private Shape rollover;
     
      protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Shape shape : shapes) {
           g.draw(shape);
        }
        if (rollover != null) {
              g.fill(rollover);
        }
      }
     
      public void mouseExited(MouseEvent me) {
        if (rollover != null) {
           rollover = null;
           repaint();
        }
      }
     
      public void mouseMoved(MouseEvent me) {
        Point p = me.getPoint();
        Shape oldRollover = rollover;
        rollover = null;
        for (Shape shape : shapes) {
           if (shape.contains(p)) {
              rollover = shape;
           }
        }   
        if (rollover != oldRollover) {
           repaint();
        } 
      }
     
      ...
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Par défaut
    Merci pour ton aide. J'ai réussi

    Voici le code qui permet de remplir une figure au survol de la souris et de la vider sinon :

    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
    private int x,y,l,h;
    Graphics2D g;
    Ellipse2D Shape;
     
    void drawG(JPanel p){
    		g=(Graphics2D)(p.getGraphics());
    		int i=150;
    		Shape=new Ellipse2D.Double(x-i,y-i/3,l+2*i,h+2*i/3); 
    		g.draw(Shape);
    	}
     
    public void mouseMoved(MouseEvent e) {
    		// TODO Raccord de méthode auto-généré
    		if(Shape.contains(e.getX(), e.getY()))
    			g.fill(Shape);
    		else
    		{
    			g.setColor(Color.white);
    			g.fill(Shape);
    			g.setColor(Color.black);
    			g.draw(Shape);
    		}
    Ne pas oublier d'implémenter la classe avec un MouseListener et de faire un addMouseListener.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 25
    Par défaut
    J'ai une question sur ce mode de fonctionnement, n'entraine-t-il pas une certaine lourdeur du fait qu'on fait le test à chaque mouvement de souris ?
    Si on commence à avoir beaucoup de shapes, n'est-ce pas problématique ?

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Si tu as vraiment beaucoup mais beaucoup de formes il va te falloir réfléchir à une meilleur organisation qu'une simple List<Shape> pour stocker tes formes ; par exemple un arbre en fonction de leur position dans la zone affichable. Mais tant que le nombre reste correcte, une simple liste suffit.
    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

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 13
    Par défaut jbox
    Citation Envoyé par bouye Voir le message
    Si tu as vraiment beaucoup mais beaucoup de formes il va te falloir réfléchir à une meilleur organisation qu'une simple List<Shape> pour stocker tes formes ; par exemple un arbre en fonction de leur position dans la zone affichable. Mais tant que le nombre reste correcte, une simple liste suffit.
    Bonjour,
    Dans ce meme contexte , moi j'ai essayé en cliquant sur un cercle un combo box avec 2 choix s'affiche mais j'ai pas réussi. est ce que vous pouvez m'aidé s'il vous plais.
    merci d'avance.

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

Discussions similaires

  1. Afficher une bulle au passage de la souris sur une image
    Par Bubale dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/05/2008, 14h04
  2. Redimensionner une TextBox au passage de la souris
    Par FredMines dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/01/2008, 19h05
  3. Ouvrir une fenêtre au passage de la souris sur une image
    Par debie1108 dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 02/05/2007, 05h11
  4. [listbox] changer la couleur d'une ligne au passage de la souris
    Par amatollah dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/10/2006, 15h25
  5. Agrandir une image au passage de la souris
    Par matika dans le forum C++Builder
    Réponses: 7
    Dernier message: 09/03/2006, 00h10

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