2009-12-21 7 views
7

¿Es posible obtener el nombre del panel al que se agrega un JLabel? Agregué algunos JLabels a diferentes JPanels, y quiero llamar a diferentes eventos de mouse según el panel sobre el que se coloquen las jLabels.JLabel - obtener el panel principal?

Respuesta

10

Si ejecuta label.getParent() devolverá el panel donde está la etiqueta.

A continuación, puede llamar al parent.getName(), pero el hecho de que ahora tendrá el objeto que quizás no necesite ahora.

3

La forma más sencilla de hacer esto:

//label1 and label2 are JLabel's 
//panel1 and panel2 are JPanel's 
doActionsForLabel(label1); 
doActionsForLabel(label2); 

public void doActionsForLabel(JLabel label) 
{ 
    if (label.getParent() == panel1) 
    { 
     //do action #1 
    } 
    else if (label.getParent() == panel2) 
    { 
     //do action #2 
    } 
} 

El código anterior supone que las etiquetas son hijos directos de los JPanels. Sin embargo, este no siempre es el caso, a veces son bisnietos o tataranietos del panel. Si este es el caso, tendrá que realizar algunas operaciones un poco más complejas para atravesar la jerarquía principal.

public void doActionsForLabel(JLabel label) 
{ 
    boolean flag = true; 
    Component parent = label; 
    while (flag) 
    { 
     parent = parent.getParent(); 
     if ((parent != null) && (parent instanceof JPanel)) 
     {    
      if (label.getParent() == panel1) 
      { 
       //do action #1 
      } 
      else if (label.getParent() == panel2) 
      { 
       //do action #2 
      }    
     } 
     else 
     { 
      flag = false; 
     } 
    } 
} 

Como Gordon ha sugerido, si no desea comprobar la igualdad de los componentes, se puede comprobar la igualdad de las propiedades de los componentes:

En lugar de label.getParent() == panel1, hacer esto o similar en vez : label.getParent().getName().equals("panel_1_name").

+0

gracias que fue muy útil :) – Kari

+0

de nada ... – bguiz

3

Si usted no sabe cómo el fondo de la etiqueta está en la jerarquía, hay algunas funciones útiles en SwingUtilities, por ejemplo: SwingUtilities.getAncestorOfClass(Class, Component)

Una alternativa a la verificación del nombre del contenedor primario en las etiquetas podría ser simplemente reenviar el evento al contenedor primario y dejar que el padre haga el trabajo. Dependiendo de lo que intente lograr, podría ser útil desacoplar las etiquetas de los padres. Los eventos de reenvío se pueden hacer usando Component. processEvent (AWTEvent).

+0

Y 'public static Contain getAncestorNamed (String name, Component comp)', si conocemos el nombre. ¡Gracias! – FaithReaper