2 pièce(s) jointe(s)
Demande d'aide pour findComponentAt
bonjour à tous,
je poursuis mon élaboration d'une interface graphique gérant des composants sur une "grille perso".
Comme me l'a suggéré gervais.b, j'essaie de mettre en œuvre une approche MVC et notamment un module "controle" qui reçoit un appel de souris éventuel sur la grille, qui est un "MouseListner" unique. (Les composants déposés sur cette grille sont sans listener).
Quand je clique sur la grille, je teste mes composants avec la méthode "findComponentAt".
En effet, cette méthode renvoie de composant lui-même si il contient effectivement les coordonnées (x,y) du clic, passées en paramètres, et sinon, elle renvoie "null".
Mon interface ressemble à ça :
Pièce jointe 588575
Pour tester la méthode, je fais un essai avec le composant "r_5", et le code :
Code:
1 2 3 4 5 6
| public static void clic_sur_grille(Point p) {
System.out.println("je clique sur la grille sur la grille : " + p);
Component cible;
cible = Grille.recept[5].findComponentAt(p);
System.out.println(" le composant détecté est : " + cible); |
, et je clique ensuite "un peu partout" sur mon interface...
Je pensais que, lorsque je clique sur la grille, ailleurs que sur le composant "r_5", j'allais récupérer "null" et que si je clique sur le composant "r_5", ce dernier serait détecté et affiché dans la console de contrôle.
La difficulté est que cela fonctionne uniquement pour un clic correspondant à la surface du composant, mais à partir des coordonnées (0,0) de la grille, alors que "r_5" est bien localisé en (384,204). Le problème est représenté ci-dessous :
Pièce jointe 588576
Ma stratégie de détection des composants par le module de contrôle étant basée sur une grille "unique sur écoute" et une déduction par traitement du composant visé,
quelqu'un peut-il me dire pourquoi cette détection basée sur les coordonnées (0,0), et ce, quel que soit le composant et où qu'il se situe, même si cette détection respecte bien la surface du composant???:calim2::calim2::calim2:
Si pas de solution, quelle nouvelle statégie peut-être possible pour ce type d'application??
Merci à tous ceux qui prendront la peine d'y réfléchir et de me répondre....:oops::oops:
nouveaux essais infructueux....
Bonjour à tous, (si d'autres que moi lisent ce message of course....)
j'ai regardé la java doc sur les deux méthodes "findCompoenetAt()" et getComponentAt().
Ces deux méthodes un peu cousines, permettent théoriquement de situer un composant sur un Jpanel par exemple.
J'ai fait un simple JPanel, avec un simple carré de couleur au milieu.
J'ai testé les deux méthodes avec le clic de souris entré en paramètre type Point.
J'ai testé les deux méthodes avec le clic de souris entré en paramètre de type (x, y).
J'ai même testé les deux méthodes avec des paramètres (x, y) en "dur", parfois dans la zone du composant central, parfois en dehors.
Le comportement est toujours le même :
La détection se fait sur une surface égale à celle du composant, ça c'est bon!!, mais détecté là où il ne se situe pas, c'est à dire à partir du point (0,0) de mon Panel...
Ça m'étonnerait que des méthodes ne fonctionnement pas. Tout à l'air ok, mais impossible à utiliser?????
Je doit devenir un peu fou et ne pas voir l'évidence.... Écrire est peut-être déjà un début de thérapie, mais bon dur de pas comprendre la méprise.....
Je vais devoir envisager un plan B, et tester moi même au clic, tous mes composants sur le panel pour savoir si ce clic correspond à un de mes composants....
Faisable, mais frustrant de ne pas comprendre pourquoi aucun moyen de faire fonctionner ces méthodes mises à disposition.....
Bravo à celui qui aura eu la patience d'aller jusqu'au bout!!:lol:
Merci pour l'explication claire!
Citation:
Envoyé par
gervais.b
Je vois beaucoup d'autres choses qui me tracassent dans ce code (nommage, aucune encapsulation, accès statiques, ..). Mais ce n'est pas l'objet de votre question initiale.
Merci gervais.b pour l'explication claire.
En effet, ma compréhension de la javadoc sur cette méthode n'était pas correcte et je n'aurais donc pas pus résoudre le dysfonctionnement de celle-ci....:applo::chin:
Je suis également "hors des clous" pour le nommage, c'est vrai, et pas d'encapsulation non plus...
Cette dernière permet d'imposer des contrôles quand on entre une valeur de l'extérieur, pas le clavier par exemple, et ainsi se protéger de déclencher une exception. Quel est son intérêt pour des données qui transitent en interne dans un programme?:oops:
Concernant la déclaration statique des "recept" de la classe Grille, j'aurais préféré les déclarer liées à g1 uniquement, c'est à dire, à ma grille objet de la classe Grille, et non comme des éléments statiques de cette classe car cela me parait plus logique.
Cependant, comme mes éléments "recept" sont manipulés par d'autres classes, cette manière "à la hussarde" me permet de les avoir disponibles pour le code, alors que l'objet g1 n'est pas encore existant au démarrage du prg.... Mais suis-je clair?....:calim2:
Quoi qu'il en soit un grand MERCI! pour votre réactivité et votre patience!!:D
A bientôt peut-être, car une avancée modeste reste un pas vers de nombreuses interrogations à venir....8O