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:
Merci de votre aide!
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 } }
Partager