Ich habe eine Swing-Komponente, die mehrere Unterkomponenten hat. Was ich tun möchte, ändern Sie eine Beschriftung, wenn die Maus über einer dieser Komponenten ist, und ändern Sie es dann in etwas anderes, wenn die Maus von allen Komponenten bewegt wird. Ich versuche, einen effizienteren Weg zu finden, dies zu tun.Swing Mouse Listeners von Kind Komponenten abgefangen werden
Zur Zeit habe ich Maus Zuhörer über alle untergeordneten Komponenten, wie etwas aussehen:
class AMouseListener extends MouseAdapter {
private boolean mouseOver;
mouseEntered(MouseEvent e) { mouseOver = true; updateLabel(); }
mouseExited(MouseEvent e) { mouseOver = false; updateLabel(); }
void updateLabel() {
String text = "not-over-any-components";
// listeners are each of the listeners added to the child components
for (AMouseListener listener :listeners) {
if (listener.mouseOver) {
text = "over-a-component";
break;
}
}
}
}
Dies funktioniert, aber ich fühle mich wie sollte es ein besserer Weg, dies zu umgehen, indem nur mouseEntered und mouseExited Behandlung von Ereignissen auf dem übergeordneten Container, aber da die untergeordneten Komponenten diese Ereignisse abfangen, bin ich mir nicht sicher, wie ich das machen soll (ich habe nicht unbedingt die Kontrolle über die untergeordneten Komponenten, daher kann ich die Mausereignisse nicht zum übergeordneten Ereignis weiterleiten Wenn ich wollte).
Warum alle erforderlichen Komponenten nicht zuordnen den gleichen Hörer. Auf diese Weise lösen alle genau die gleiche Aktion aus. – Morfic
könnten Sie vielleicht Ihren Code erweitern, um das Problem zu zeigen? Da ich das Problem und Ihre "gewollte" Lösung –
@Grove nicht ganz verstehe, gibt es, wenn ich jeder Komponente denselben Listener zuweiße, ein potentielles Rennen, abhängig davon, ob mouseEntered für eine Komponente vor oder nach mouseExited für eine andere auftritt. Nehmen wir an, ich bin über Komponente1 und ich bewege die Maus nach Komponente2. Wenn die mouseEntered Component2 vor mouseExited Component1 verarbeitet wird, ist der Text falsch. Ich bin mir nicht sicher, ob es eine garantierte Reihenfolge für diese Ereignisse gibt, da die gleiche Mausbewegung die ausgehende Komponente1 und die Eingabe von Komponente2 erzeugen würde. –