2009-05-13 15 views
5

¿Cómo sé si puedo encontrar un componente en JPanel?Una forma rápida de determinar si se encuentra un Componet en JPanel

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

El uso del bucle no es eficiente. ¿Hay alguna forma mejor?

+0

Nº es meramente basada en la razón técnica 'falso'. Con el fin de obtener> 1ra relación de nivel de profundidad de relación padre-hijo, tengo uso de llamada recursiva para lograr. En el momento en que leí Tom Hawtin, mi primer pensamiento es getComponents devolverá> 1st first level level children (que no es cierto). Por lo tanto, primero pensé que era más directo que el tuyo, y esto hace que haga clic en aceptarlo como respuesta sin pensarlo mucho. Es mi error La respuesta irá a la tuya :) –

Respuesta

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

Llame recursivamente si no desea relaciones inmediatas entre padres e hijos (que probablemente sea el caso en un panel bien diseñado).

... aunque en un panel bien diseñado, es muy cuestionable por qué necesita saber si un componente está contenido en el panel.

+1

+1 para "... aunque en un panel bien diseñado, es muy cuestionable por qué necesitarías saber si un componente está contenido en el panel". –

+0

¿Es un panel dinámico un panel mal diseñado? – alphazero

+0

No hay una regla que encaje para todos. Usa el sentido común. El panel dinámico es bueno y mis usuarios están contentos con él, y el panel dinámico necesita descubrir padres/hijos dinámicamente durante el tiempo de ejecución. Siempre y cuando mis usuarios estén contentos, no es nada cuestionable cuando necesito saber si un componente está contenido en el panel. –

3

El rendimiento de esta operación es muy poco probable que sea un cuello de botella.

Mirar a través del contenido de un contenedor probablemente indica un mal diseño. Dígale a la GUI qué hacer, no interrogue su estado.

Probablemente una mejor manera de escribir el código es utilizar las rutinas existentes. Si bien hay algunos gastos generales, es más probable que ya estén compilados (por lo tanto, posiblemente más rápido) y tengan menos código.

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

(O respuesta uso de kdgregory.)

4

puede utilizar

jPanel.isAncestorOf(component) 

para la búsqueda recursiva

Cuestiones relacionadas