Возможно ли получить имя панели, к которой добавлен JLabel? Я добавил несколько JLabels для разных JPanels, и я хочу называть разные события мыши в соответствии с той панелью, в которую помещаются jLabels.
Самый простой способ сделать это:
//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")
.
Если вы запустите label.getParent()
, он вернет панель, внутри которой находится ярлык.
Затем вы можете вызвать parent.getName()
, но тот факт, что у вас теперь будет объект, который вам может не понадобиться сейчас.
Если вы не знаете, насколько глубоко ваш ярлык находится в иерархии, в SwingUtilities
есть некоторые удобные функции, например: SwingUtilities.getAncestorOfClass(Class, Component)
Альтернатива проверка имени родительского контейнера в ваших ярлыках может заключаться в том, чтобы просто переслать событие в родительский контейнер и позволить родителям выполнять эту работу. В зависимости от того, что вы пытаетесь достичь, было бы полезно отделить этикетки от родителей. События пересылки могут быть выполнены с помощью Component.processEvent(AWTEvent)
.
public static Container getAncestorNamed(String name, Component comp)
, если мы знаем имя. Благодаря!
– WesternGun
19 April 2017 в 09:50