J'ai un JPanel qui a une ligne, un cercle, etc. Maintenant, lorsque je clique sur la ligne, l'événement sera signalé comme un événement de ligne ou un événement JFrame général. Je dois pouvoir déplacer la ligne si l'utilisateur clique sur la ligne et la déplace. Est-ce possible en Java2D?Java2D: Capture d'un événement sur un objet Ligne
Répondre
Oui, mais vous devrez faire un peu de travail (voir java.awt.Shape). Fondamentalement, vous devez suivre une liste de formes. Le JPanel recevra un événement de souris, que vous pouvez traduire en coordonnées (x, y). Vous pouvez ensuite appeler Shape.contains (x, y) pour voir si vos différentes formes ont été cliquées.
Cela fonctionnera bien pour Circle, Polygon, Arc, etc; cependant dans le cas de Line2D, cela ne fonctionnera pas aussi facilement, mais vous pouvez utiliser Line2D.intersects() avec un petit rectangle autour du clic de la souris (c'est aussi une bonne interface car vous ne voulez pas forcer l'utilisateur à cliquer) exactement sur un pixel qui est difficile à voir).
Il n'y a pas de concept comme "événement de ligne" sauf si vous décidez de l'implémenter.
Je suggère d'ajouter un MouseListener
et un MouseMotionListener
au Canvas
ou JPanel
sur lequel vos formes géométriques sont dessinés. Utilisez le rappel mousePressed(MouseEvent)
de MouseListener
pour déterminer si une forme donnée a été cliquée. Une fois que vous avez établi cela, utilisez la méthode mouseDragged(MouseEvent)
de MouseMotionListener
pour déplacer et redessiner la forme lorsque le curseur de la souris est déplacé.
Voici un simple example qui démontre certaines des techniques présentées dans d'autres réponses.
J'ai créé une bibliothèque de balisage sur toile en Java il y a quelques années et si vous n'avez pas à vous soucier des transformations sur le canevas (mise à l'échelle, rotation, etc.), c'est très facile.
Fondamentalement, vous avez juste besoin de maintenir une collection des formes de toile dans une liste (pas un ensemble, car l'ordre Z est probablement important). L'écouteur de souris sera sur votre toile, et non sur des formes individuelles. Ajoutez de nouveaux éléments au début de votre collection (ou répétez la liste plus tard). Lorsque le canevas reçoit un événement de souris vers le bas, passez en revue votre collection de formes jusqu'à ce que vous en trouviez une qui se trouve sous les coordonnées de votre souris. La méthode la plus simple consiste à implémenter une interface qui définit une sorte de méthode hitPoint (int x, int y). De cette façon, vos rectangles peuvent implémenter un contains(), les lignes peuvent faire des intersects() ou des chemins graphiques, vous pouvez tenir compte de certains padding, etc.
En allant un peu plus loin, vos formes devraient définir leur propre dessin (Graphics2D g) méthode pour que vous puissiez facilement faire des choses comme des boîtes de sélection, ou définir le mode de peinture à XOR pour faciliter la «mise en mouvement» de la forme. La méthode paintComponent de votre canevas aurait juste à parcourir la collection de formes, en appelant shape.draw (g) sur chacune d'elles, en passant l'instance graphique fournie à la méthode paintComponent.