Java JLabel-获取父面板?

Java JLabel-获取父面板?,java,swing,Java,Swing,是否可以获取添加了JLabel的面板的名称? 我向不同的JPanel添加了一些JLabel,我想根据JLabel放置在哪个面板上调用不同的鼠标事件。如果运行label.getParent()它将返回标签所在的面板 然后您可以调用parent.getName(),但事实上您现在拥有的对象可能不需要它了。最简单的方法是: //label1 and label2 are JLabel's //panel1 and panel2 are JPanel's doActionsForLabel(label1

是否可以获取添加了JLabel的面板的名称?
我向不同的JPanel添加了一些JLabel,我想根据JLabel放置在哪个面板上调用不同的鼠标事件。

如果运行
label.getParent()
它将返回标签所在的面板


然后您可以调用
parent.getName()
,但事实上您现在拥有的对象可能不需要它了。

最简单的方法是:

//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
    }
}
上面的代码假定标签是JPanel的直接子级。然而,情况并非总是如此,有时他们是专家组的曾孙或曾孙。如果是这种情况,您必须执行一些稍微复杂的操作来遍历父层次结构

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;
        }
    }
}
正如Gordon所建议的,如果您不想测试组件的相等性,您可以测试组件属性的相等性:


不要使用
label.getParent()==panel1
,而是执行以下操作或类似操作:
label.getParent().getName().equals(“panel_1_name”)

如果您不知道标签在层次结构中的深度,则
SwingUtilities
中有一些方便的函数,例如:


检查标签中父容器名称的另一种方法是将事件转发给父容器,并让父容器完成工作。根据您试图实现的目标,将标签与父项分离可能会很有用。转发事件可以使用
组件(AWTEvent)

公共静态容器getAncestorNamed(字符串名称,组件组件)
,如果我们知道名称的话。谢谢