2009-12-21 29 views
7

JLabel'in eklendiği panelin adını almak mümkün mü? Farklı JPanellere bazı JLabels ekledim ve jLabels'in yerleştirildiği panele göre farklı fare olayları aramak istiyorum.JLabel - ana paneli al?

cevap

10

label.getParent()'u çalıştırırsanız, etiketin içinde bulunduğu paneli döndürür.

parent.getName() numaralı telefonu arayabilirsin, ancak şimdi buna ihtiyacınız olmayan bir nesneye sahip olacaksın.

3

basit yolu bunu yapmak için:

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

Yukarıdaki kod etiketleri JPanels direkt çocukları olduklarını varsayar. Ancak, bu her zaman böyle olmayabilir, bazen büyük torunlar ya da panelin büyük torunları. Bu durumda, üst sıradaki hiyerarşiden geçmek için biraz daha karmaşık işlemler gerçekleştirirsiniz. , label.getParent() == panel1 ait

yerine yerine bu veya benzeri yapın: Eğer bileşenlerin eşitliği için test etmek istemiyorsanız Gordon gibi

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

Eğer bileşenlerin özelliklerinin eşitliği test edebilirsiniz, önerdi : label.getParent().getName().equals("panel_1_name").

+0

bu çok yardımcı oldu :) – Kari

+0

Hoş Geldiniz ... – bguiz

3

Eğer etiket hiyerarşisinde aşağı, örneğin, SwingUtilities bazı kullanışlı işlevler var ne kadar derin bilmiyorsanız: SwingUtilities.getAncestorOfClass(Class, Component)

Etiketlerinizde üst kapsayıcı adını kontrol alternatifi olabilir olayı ana taşıyıcıya basitçe iletmek ve ebeveynin işi yapmasına izin vermek. Neyi başarmaya çalıştığınıza bağlı olarak, etiketleri ebeveynlerden ayırmak yararlı olabilir. Yönlendirme olayları Component. processEvent (AWTEvent) kullanılarak yapılabilir.

+0

Ve 'public static Container getAncestorNamed (Dize adı, Bileşen comp)', adını biliyorsanız. Teşekkürler! – FaithReaper