En passant événements de parent
J'aimerais créer une application où certains événements sont censés être manipulés comme s'ils étaient livrés à conteneurs parents. Par exemple, j'ai un JPanel
qui contient JLabel
. Le haut JPanel
implémente mousepress et en les faisant glisser à droite maintenant. De quoi ai-je besoin de le faire, afin de rendre les événements se ressemblent, ils sont arrivés à JPanel
au lieu de l'étiquette elle-même. (modification de l'objet source est importante)
Est-il une meilleure solution que la mise en œuvre des événements et en les reproduisant dans le parent? (ce serait fastidieux après quelques objets avec >5 enfants).
Pourquoi avez-vous besoin pour ce faire (par exemple)?
J'ai des objets avec de nombreux labels, qui doit être déplacé partout où ils sont effectivement cliqué la première fois. Juste maintenant, ils sont déplaçables à la souris seulement lorsque je clique sur l'arrière-plan de l'élément, pas une étiquette à l'intérieur.
J'ai des objets avec de nombreux labels, qui doit être déplacé partout où ils sont effectivement cliqué la première fois. Juste maintenant, ils sont déplaçables à la souris seulement lorsque je clique sur l'arrière-plan de l'élément, pas une étiquette à l'intérieur.
OriginalL'auteur viraptor | 2010-09-29
Vous devez vous connecter pour publier un commentaire.
À votre écouteur d'événement, vous pouvez envoyer l'événement pour le composant parent.
Être
myEvent
la gestion des événements de la fonction argument:Mais cette solution implique la création d'une nouvelle EventListener pour chaque élément à ajouter.
Ainsi, vous pouvez créer un seul gestionnaire d'événement et de le réutiliser, de l'ajouter à tous les enfants, comme ceci:
Point de vue des ressources c'est une mauvaise idée. Vous êtes en train d'ajouter beaucoup de surcharge pour rien. Il est beaucoup plus efficace pour retirer les écouteurs de souris sur les éléments d'enfant. Vous pouvez voir ma réponse à comment le faire de manière récursive.
OriginalL'auteur Tomas Narros
Vous devez convertir les cas, avant son envoi à la société mère. Conversion comprend les coordonnées de traduction par rapport au parent.
C'est une parfaite réponse valable. Simplement, il s'appuie sur la réponse à faire et peut se tenir debout sur ses propres. Il serait mieux si Wojtek permettrait de décrire un peu plus le pourquoi de ce réglage est nécessaire.
Point de vue des ressources c'est une mauvaise idée. Vous êtes en train d'ajouter beaucoup de surcharge pour rien. Il est beaucoup plus efficace pour retirer les écouteurs de souris sur les éléments d'enfant. Vous pouvez voir ma réponse à comment le faire de manière récursive.
OriginalL'auteur Wojciech Wirzbicki
Les événements de la souris sont automatiquement envoyées au plus profond composant a la souris auditeurs.
De ce fait, pour atteindre votre objectif, vous pouvez simplement supprimer tous les écouteurs de souris sur le JLabel et il ne sera jamais choisi comme cible pour les événements de la souris.
Le code suivant désactive la souris auditeurs sur les composants et leurs enfants de manière récursive:
J'ai essayé cela avec KeyListeners, au lieu de cela - il ne se propagent pas à la société mère; viens absorbé. (J'ai dû désactiver
focusable
et, éventuellement,requestFocusEnable
.) Si la même chose est vraie pour les écouteurs de souris, c'est peut-être pourquoi ils downvoted vous. Avez-vous testé votre solution pour faire en sorte qu'il fonctionne?KeyListeners sont assez différents. Cette solution a été mise en prod depuis des années dans mon entreprise, fonctionne très bien.
Ne fonctionne pas pour JTextPane pour moi.
Sous-classement et d'appeler votre méthode ainsi que
disableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
a fait pour moi.OriginalL'auteur qwertzguy