Après avoir essayé différentes approches sur un conteneur, sans succès, je me suis retrouvé à l'aide d'une minuterie .Cela n'a pas aidé que mon conteneur contenait des éléments qui avaient déjà besoin d'écouteurs de souris.
L'approche de la minuterie signifiait également que je pouvais retarder le changement pendant une courte période. (Dans mon cas, je montre des boutons supplémentaires dans un nœud d'arbre (un récipient), ainsi que de changer l'arrière-plan.)
Sur un mouseEntered() sur le récipient, une minuterie est créé (sinon là déjà) qui se répète toutes les 260 millisecondes. À chaque appel du temporisateur, il détermine si la souris est à l'intérieur du conteneur. Si c'est le cas, la première fois, il signale le passage de la souris. Si ce n'est pas le cas, il signale qu'il n'y a pas de souris et arrête le chronomètre.
En Scala, est la suivante, où l'appel de méthode pour entryExit() encode si la souris est terminée ou non (où plusieurs appels avec la même valeur ont aucun):
abstract class MouseInterpreter(component: JComponent) extends MouseAdapter {
...
private var mouseOverAction:() => Unit =() => {}
private var mouseOverTimer: Option[Timer] = None
...
def entryExit(entered: Boolean) // this is an abstract method
override def mouseEntered(e: MouseEvent) {
if (mouseOverTimer.isEmpty) {
val aTimer = new Timer(260, new ActionListener {
def actionPerformed(e: ActionEvent) {
mouseOverAction()
}
})
mouseOverTimer = Some(aTimer)
mouseOverAction =() => {
mouseOverAction =() => {
val point = MouseInfo.getPointerInfo.getLocation
SwingUtilities.convertPointFromScreen(point, component)
if (component.getVisibleRect.contains(point))
entryExit(entered = true)
else {
entryExit(entered = false)
aTimer.stop()
mouseOverTimer = None
mouseOverAction =() => {}
}
}
}
aTimer.setRepeats(true)
aTimer.start()
}
}
...
}
Si vous déplacez le pointeur de l'extérieur vers un enfant contenu (avec un écouteur souris), un écouteur souris sur le conteneur parent ne sera pas déclenché. Déplacez-le lentement sur une région frontalière et il le fera. –
J'ai utilisé un mélange de votre technique et de Tom Hawtin. Malheureusement, un seul d'entre vous peut obtenir la bonne réponse. Merci a tous. –