Mam element swing, który ma kilka komponentów podrzędnych. Co chcę zrobić zmienić niektóre etykiety, jeśli mysz jest nad jednym z tych składników, a następnie zmienić go na coś innego, jeśli mysz porusza się wszystkie składniki. Próbuję znaleźć bardziej skuteczny sposób na zrobienie tego.swingers słuchacze są przechwytywane przez elementy potomne
Obecnie mam słuchaczy myszy nad wszystkich elementów podrzędnych, które wyglądają mniej więcej tak:
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;
}
}
}
}
To działa, ale czuję się jak nie powinno być lepszym sposobem obsługi to tylko przez obsługę mouseEntered i mouseExited wydarzenia w kontenerze nadrzędnym, ale ponieważ komponenty potomne przechwytują te zdarzenia, nie jestem pewien, jak to zrobić (niekoniecznie mam kontrolę nad komponentami potomnymi, więc nie mogę przekazać zdarzeń myszy do zdarzenia nadrzędnego jeśli chciałem).
Dlaczego nie przydzielić tego samego słuchacza do wszystkich niezbędnych składników. W ten sposób wszyscy uruchamiają dokładnie tę samą akcję. – Morfic
Czy mógłbyś rozwinąć swój kod, aby pokazać probelm? ponieważ nie bardzo rozumiem probelm i twoje "pożądane" rozwiązanie –
@Grove, jeśli przypiszę tego samego słuchacza do każdego komponentu, istnieje potencjalny wyścig w zależności od tego, czy mouseEntered na jednym komponencie występuje przed czy po mouseExited na innym. Załóżmy, że mam ponad komponent1 i przenoszę myszkę na komponent2. Jeśli składnik MouseEntered Component2 zostanie przetworzony przed komponentem MouseExited Component1, tekst będzie niepoprawny. Nie jestem pewien, czy istnieje zagwarantowana kolejność tych zdarzeń, ponieważ ten sam ruch myszy wygenerowałby wyjście z komponentu1 i wprowadzenie komponentu2. –