2009-12-21 26 views
7

是否可以獲取JLabel添加到的面板的名稱? 我添加了一些JLabel到不同的JPanels,我想調用不同的鼠標事件,根據jLabel放置在哪個面板上。JLabel - 獲取父面板?

回答

10

如果您運行label.getParent()它將返回標籤所在的面板。

然後,您可以致電parent.getName(),但事實上,您現在將擁有可能不需要的對象。

3

,最簡單的方式做到這一點:

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

上面的代碼假定標籤是JPanels的直接孩子。然而,情況並非總是如此,有時他們是專家組的曾孫或曾孫。如果是這種情況,你將會做一些稍微複雜的操作來遍歷父層次結構。

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

戈登曾建議,如果你不想來測試組件的平等,你可以測試組件的屬性的平等:

代替label.getParent() == panel1,做到這一點或類似的,而不是:label.getParent().getName().equals("panel_1_name")

+0

謝謝,這是非常有幫助:) – Kari 2009-12-21 08:52:23

+0

不客氣... – bguiz 2009-12-21 13:14:50

3

如果你不知道有多深了你的標籤是層次結構,還有一些便利的功能SwingUtilities,例如:SwingUtilities.getAncestorOfClass(Class, Component)

來檢查您的標籤父容器名稱的替代可能是簡單地將事件轉發給父容器,並讓父母完成工作。根據您想要實現的內容,將標籤與父母分離可能很有用。轉發事件可以使用Component. processEvent (AWTEvent)完成。

+0

和'公共靜態容器getAncestorNamed(字符串名稱, 組件comp)',如果我們知道名稱。謝謝! – FaithReaper 2017-04-19 09:50:13