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

Interfaces Graphiques en Java Discussion :

Listener sur objets graphiques


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Points : 48
    Points
    48
    Par défaut Listener sur objets graphiques
    Bonjour,

    je suis actuellement en train de développer une application graphique permettant de dessiner et manipuler des éléments graphiques (rectangle, ellipse, ligne, etc).
    J'ai donc une classe Container héritant de JPanel, et des classes représentant les objets héritant de classes regroupant les objets selon leur caractéristiques communes (rectangle et ellipse par exemple) et héritant elles mêmes d'une classe Primitive.
    Bref avant toute chose, j'aimerais savoir s'il est préférable de faire une gestion des évènements (mouseListener quoi) dans le Container qui contient tous mes objets (dans une liste) ou alors déléguer certaines actions aux objets eux mêmes (en sachant que des classes objets devront pouvoir être ajoutées plus tard par d'autres programmeurs)?

    La 1er méthode me semblait limitée car dans la classe Container il fallait pouvoir identifier le type de objets (à l'aide de instanceof ou getClass()), afin de savoir quelle action effectuer (quelle méthode appeler) et pour pouvoir caster sur le bon type; ce qui reduisait l'évolutivitée du code (obligation de modifier la classe Container lors de l'implémentation d'un nouvel objet).

    Pour la seconde méthode, je suis confronté à un problème de nature différente, à savoir un problème de focus (Listener) entre chacun des objets et le Container. En effet quand par exemple je passe au dessus d'un objet de type Cercle, celui-ci étant représenté comme un carré, quand je passe ma souris en dehors du cercle mais dans ce carré, le listener de l'objet rentre en action au détriment du listener du Container. Je ne peux donc pas par exemple, dessiner un nouvel objet en positionnant ma souris à cet endroit (la création d'objet se fait dans la fonction mousePressed du Container). J'espère avoir été clair pour ce problème, même en ciblant si la souris survole le cercle grâce à la méthode contains() par exemple, je reste bloqué dans le cas où elle est en dehors de ce cercle mais pas en dehors de l'objet.
    Quelques codes schématiques pour le second cas de figure:

    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
    class Container extends JPanel implements MouseListener {
        private ArrayList<Primitive> list;
     
        public void mousePressed(MouseEvent e) {
            Circle c = new Circle(x, y);
            list.add(c);
            this.add(c);
        }
    }
     
    class Circle extends JComponent implements MouseListener {
        private Ellipse2D circle;
     
        public void mousePressed(MouseEvent e) {
    	double x = e.getPoint().getX();
    	double y = e.getPoint().getY();
     
    	if(circle.contains(getX() + x, getY() + y))
    	    // ok on est dans le cercle
    	else 
                // faudrait quitter le listener de l'objet pour revenir à celui du container
        }
    }
    Merci de votre aide!

  2. #2
    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
    Ce sujet a été abordé une multitude de fois.
    Voici en vrac quelques idées :
    • il ne faut pas faire un Component par objet,
    • faire un seul JPanel, chargé d'afficher un BufferedImage
    • l'affichage se fait dans le BufferedImage, un appelle à repaint sur le JPanel d'affichage permet d'afficher la nouvelle image,
    • il faut mettre à jour une liste d'objets,
    • chaque objet peut dire s'il contient un point représentant les coordonnées de la souris.

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Points : 48
    Points
    48
    Par défaut
    Merci pour ces infos, j'ai en effet lu pas mal de topics sur le sujet mais rien ne correspondait précisément à ce que je voulais savoir.
    Tu préconises donc la 1er solution (c'est celle que j'ai implémentée pour l'instant). J'ignore cela dit si ça risque de me poser des problèmes à l'ajout d'éventuels nouveaux objets, sachant que je ne dois pas modifier, dans la mesure du possible, le code du Container.

  4. #4
    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
    Le code du Container parent pourrait simplement déclarer une méthode abstraite comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract boolean contient( int x, int y );
    obligeant ainsi toutes les classes dérivées à déclarer une méthode permettant de savoir si un point est à l'intérieur ou à l'extérieur du dessin.

Discussions similaires

  1. Callback sur le focus d'un objet graphique
    Par Maickeul dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 20/07/2007, 16h00
  2. Réponses: 1
    Dernier message: 03/04/2007, 10h27
  3. manipuler les objets graphique d'excel sur access
    Par technopole dans le forum Access
    Réponses: 4
    Dernier message: 21/07/2006, 10h37
  4. Export JPG sur objet graphique - Pb OLE
    Par Invité dans le forum Access
    Réponses: 6
    Dernier message: 12/05/2006, 16h38
  5. action sur objet graphique???
    Par ricardvince dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 27/04/2006, 18h53

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