JLabel - получить родительскую панель? - PullRequest
7 голосов
/ 21 декабря 2009

Можно ли получить имя панели, к которой добавлен JLabel? Я добавил несколько JLabels в разные JPanels и хочу вызывать разные события мыши, в соответствии с тем, на какую панель помещены jLabels.

Ответы [ 3 ]

10 голосов
/ 21 декабря 2009

Если вы запустите label.getParent(), вернется панель, внутри которой находится ярлык.

Затем вы могли бы позвонить parent.getName(), но тот факт, что теперь у вас будет объект, вам может не понадобиться сейчас.

3 голосов
/ 21 декабря 2009

Если вы не знаете, насколько глубоко ваша метка находится в иерархии, в SwingUtilities есть несколько удобных функций, например: SwingUtilities.getAncestorOfClass(Class, Component)

Альтернативой проверке имени родительского контейнера в ваших ярлыках может быть просто переслать событие в родительский контейнер и позволить родителю делать всю работу. В зависимости от того, чего вы пытаетесь достичь, может быть полезно отделить ярлыки от родителей. Переадресация событий может быть выполнена с помощью Component.<a href="http://java.sun.com/javase/6/docs/api/java/awt/Component.html#processEvent(java.awt.AWTEvent)" rel="nofollow noreferrer">processEvent</a>(AWTEvent).

3 голосов
/ 21 декабря 2009

Самый простой способ сделать это:

//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").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...