是否可以获取添加JLabel的面板名称? 我在不同的JPanels中添加了一些JLabel,我想根据放置jLabel的面板调用不同的鼠标事件。
答案 0 :(得分:10)
如果您运行label.getParent()
,它将返回标签所在的面板。
然后你可以调用parent.getName()
,但事实上你现在将拥有你现在可能不需要的对象。
答案 1 :(得分: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;
}
}
}
正如Gordon所建议的,如果你不想测试组件的相等性,你可以测试组件属性的相等性:
而不是label.getParent() == panel1
,而是执行此操作或类似操作:label.getParent().getName().equals("panel_1_name")
。
答案 2 :(得分:3)
如果您不知道标签在层次结构中的深度,SwingUtilities
中有一些方便的功能,例如:SwingUtilities.getAncestorOfClass(Class, Component)
检查标签中父容器名称的替代方法可以是简单地将事件转发到父容器,让父母执行工作。根据您要实现的目标,将标签与父母分离可能很有用。转发活动可以使用Component.processEvent(AWTEvent)
完成。