2009-12-21 10 views
7

È possibile ottenere il nome del pannello a cui è aggiunta una JLabel? Ho aggiunto alcuni JLabels a diversi JPanel, e voglio chiamare diversi eventi del mouse in base al pannello su cui sono posizionati i jLabels.JLabel - ottieni il pannello genitore?

risposta

10

Se si esegue label.getParent(), il pannello restituirà l'etichetta all'interno.

Si potrebbe quindi chiamare parent.getName() ma il fatto che ora si avrà l'oggetto che potrebbe non essere necessario ora.

3

Il modo più semplice per fare questo:

//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 
    } 
} 

Il codice sopra presuppone che le etichette sono figli diretti dei JPanels. Tuttavia, questo potrebbe non essere sempre il caso, a volte sono pronipoti o pronipoti della giuria. Se questo è il caso, avrai alcune operazioni leggermente più complesse per attraversare la gerarchia genitore.

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; 
     } 
    } 
} 

Come Gordon ha suggerito, se non si vuole verificare l'uguaglianza dei componenti, è possibile verificare l'uguaglianza delle proprietà dei componenti:

Invece di label.getParent() == panel1, fare questo o simile, invece : label.getParent().getName().equals("panel_1_name").

+0

grazie è stato molto utile :) – Kari

+0

prego ... – bguiz

3

Se non si sa come in fondo la vostra etichetta è nella gerarchia, ci sono alcune funzioni a portata di mano in SwingUtilities, ad esempio: SwingUtilities.getAncestorOfClass(Class, Component)

Un'alternativa a controllare il nome del contenitore padre nelle etichette potrebbe essere semplicemente inoltrare l'evento al contenitore genitore e lasciare che il genitore faccia il lavoro. A seconda di ciò che stai cercando di ottenere, potrebbe essere utile disaccoppiare le etichette dai genitori. Gli eventi di inoltro possono essere eseguiti utilizzando Component. processEvent (AWTEvent).

+0

E 'contenitore statico pubblico getAncestorNamed (Nome stringa, Component comp)', se conosciamo il nome. Grazie! – FaithReaper