2009-05-13 13 views
5

Czy mogę wiedzieć, w jaki sposób mogę ustalić, czy komponent znajduje się w JPanel?Szybki sposób ustalania, czy w JPanel znajduje się Componet

boolean isThisComponentFoundInJPanel(Component c) 
{ 
    Component[] components = jPanel.getComponents(); 
    for (Component component : components) { 
     if (c== component) { 
       return true; 
     } 
    } 
    return false; 
} 

Korzystanie z pętli nie jest wydajne. Czy istnieje lepszy sposób?

+0

Nie jest jedynie na podstawie 'false' przyczyn technicznych. Aby uzyskać> 1. poziom relacji rodzic-dziecko poziomu głębokości, używam rekursywnego połączenia, aby osiągnąć. W tym czasie czytałem Tom Hawtin, moją pierwszą myślą jest getComponents zwróci> 1. dzieci poziomu głębi (co nie jest prawdą). Dlatego najpierw pomyślałem, że jest to bardziej proste niż twoje, a to sprawia, że ​​klikam, akceptuję to jako odpowiedź bez większego zastanowienia. Czy to mój błąd. Odpowiedź trafi do Ciebie :) –

Odpowiedz

11
if (c.getParent() == jPanel) 

Zadzwoń rekursywnie, jeśli nie chcesz mieć bezpośrednich relacji rodzic-dziecko (co prawdopodobnie ma miejsce w dobrze zaprojektowanym panelu).

... Chociaż w dobrze zaprojektowanym panelu bardzo wątpliwe jest, aby wiedzieć, czy dany składnik znajduje się w panelu.

+1

+1 dla "... chociaż w dobrze zaprojektowanym panelu, to jest bardzo wątpliwe, dlaczego musisz wiedzieć, czy komponent jest zawarty w panelu." –

+0

Czy panel dynamiczny to źle zaprojektowany panel? – alphazero

+0

Nie ma jednej reguły pasującej do wszystkich. Użyj rozumu. Panel dynamiczny jest dobry i moi użytkownicy są z niego zadowoleni, a panel dynamiczny musi dynamicznie wykrywać rodzic/dziecko podczas pracy. Tak jak moi użytkownicy są szczęśliwi, nie ma wątpliwości, że muszę wiedzieć, czy dany komponent znajduje się w panelu. –

3

Wydajność tej operacji jest mało prawdopodobne, aby być wąskim gardłem.

Przeglądanie zawartości pojemnika prawdopodobnie wskazuje zły projekt. Powiedz GUI, co robić, nie przesłuchuj jego stanu.

Prawdopodobnie lepszym sposobem napisania kodu jest użycie istniejących procedur. Chociaż istnieje pewien narzut, są one bardziej prawdopodobne, że zostały już skompilowane (a więc prawdopodobnie szybciej) i są mniej kodowane.

boolean isComponentInPanel(Component component) { 
    return 
     java.util.Arrays.asList(panel.getComponents()) 
      .contains(component); 
} 

(Albo odpowiedź wykorzystaniu koniecznie kdgregory Użytkownika).

4

można użyć

jPanel.isAncestorOf(component) 

dla rekurencyjnego wyszukiwania

Powiązane problemy