Как получить доступ к компоненту, содержащему компонент в Swing [duplicate]

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

7
задан Kari 21 December 2009 в 08:57
поделиться

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

3
ответ дан bguiz 19 August 2018 в 02:17
поделиться

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

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

10
ответ дан Nate 19 August 2018 в 02:17
поделиться

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

Альтернатива проверка имени родительского контейнера в ваших ярлыках может заключаться в том, чтобы просто переслать событие в родительский контейнер и позволить родителям выполнять эту работу. В зависимости от того, что вы пытаетесь достичь, было бы полезно отделить этикетки от родителей. События пересылки могут быть выполнены с помощью Component.processEvent(AWTEvent).

3
ответ дан Samuel Sjöberg 19 August 2018 в 02:17
поделиться
  • 1
    И public static Container getAncestorNamed(String name, Component comp), если мы знаем имя. Благодаря! – WesternGun 19 April 2017 в 09:50
Другие вопросы по тегам:

Похожие вопросы: