Как получить верхнюю карту в CardLayout Java

можно ли получить верхнюю карту в CardLayout Java? Я попытался выполнить цикл через каждый компонент, чтобы проверить видимость с помощью isVisible (), но кажется, что все они "видимы".

Edit: под "верхней картой" я имею в виду ту, которая в настоящее время находится в "верхней", отображается, а не первая или последняя карты. Кроме того, я не знаю, помогает ли это, но я ищу JPanel (или его подкласс)

Edit: фрагмент кода

for (Component component : getComponents()) {
 if (component instanceof JPanel && component.isVisible()) {
  currentPanel = (JPanel) component;
  System.out.println(currentPanel.getClass().getName());
 }
}  

приведенный выше код всегда распечатывает имя каждого класса компонентов, независимо от того, являются ли они видимой картой или нет.

редактировать: я использую это как часть школьного задания. Я не пытаюсь получить халяву здесь, задание не вращается вокруг этого макета. Это просто кажется наиболее удобным расположением для изменения между панелями. Мой учитель указал, что в проекте не должно быть стороннего кода. Я видел реализацию из ссылки camickr раньше, но я не могу использовать он. Я могу свободно реализовать аналогичные функции и, возможно, дать ссылку на него в документации, но я не могу просто скачать и использовать его.

редактировать: причина, по которой я пытаюсь получить лучшие карты, потому что у меня есть панель инструментов с кнопкой "Добавить". Вместо того, чтобы иметь одну кнопку добавления для каждой из моих двух возможных вещей, я хотел, чтобы он знал, что добавить, просто посмотрев на то, что панель в настоящее время просматривается. Если есть другой, более подходящий способ сделать это, пожалуйста, дайте мне знать.

редактировать: спасибо всем за помощь. Я понял, в чем проблема. Я думаю, это была моя вина, так как я не предоставил достаточно деталей. Две мои карты -JScrollPanes, и мне также нужно было просмотреть его содержимое, чтобы узнать, была ли одна из этих панелей той, которую я видел. Я не проверял isVisible() на самой панели прокрутки я смотрел на это утверждает, что всегда видны, это была панель прокрутки, видимость которой мне нужно проверить.

public JPanel getCurrentPanel() {
        JPanel currentPanel = null;

        for (Component component : getComponents()) {
            if (component.isVisible()) {
                if (component instanceof JPanel) 
                    currentPanel = (JPanel) component;
                else if (component instanceof JScrollPane)
                    currentPanel = (JPanel) ((JScrollPane) component).getViewport().getComponent(0);
            }
        }

        return currentPanel;
    }

4 ответов


Если вы измените фрагмент кода, добавленный к вопросу, вы можете легко определить, какая карта видна. В моем тестовом фрейме, когда кнопка нажата, она печатает имя текущей видимой карты, прежде чем перейти к следующей карте. Изменяя ваш код, важно иметь в виду, что вам нужно вызвать getComponents() на компоненте, который фактически имеет CardLayout. Таким образом, виден только один из его детей. Я предполагаю, что в вашем коде вы вызываете getComponents на кадре, который содержит вашу JPanel с CardLayout.

class TestFrame
        extends JFrame
        implements ActionListener
{
    public TestFrame()
    {
        cards = new JPanel(new CardLayout() );
        card_list = new JPanel[5];

        for (int i = 0; i < card_list.length; i++) {
            String text = "Card " + i;
            JPanel card = createCard(text);
            card_list[i] = card;
            cards.add(card, text);
        }

        add(cards);
    }

public JPanel getCurrentCard()
{
    JPanel card = null;

    for (Component comp : cards.getComponents() ) {
        if (comp.isVisible() == true) {
            card = (JPanel)comp;
            System.out.println(card.getName() );
        }
    }
    System.out.println();

    return card;
}

public void actionPerformed(ActionEvent evt)
{
    JPanel card = getCurrentCard();

    CardLayout cl = (CardLayout)(cards.getLayout() );
    cl.next(cards);
}

    public JPanel createCard(String text)
    {
        JPanel card = new JPanel();
        card.setName(text);

        JButton btn = new JButton(text);
        btn.addActionListener(this);

        card.add(btn);
        return card;
    }

    JPanel cards;
    JPanel[] card_list;
}

в методе actionPerformed () я напечатал имя карты, но у вас есть ссылка на текущую видимую карту.


я расширил CardLayout, чтобы обеспечить этот тип функциональности. См.Карта Макет Фокус.

изменить:

затем выполните цикл через компоненты, ища compnent с ZOrder 0. Это тот, который нарисован сверху. На самом деле вам даже не нужно перебирать все компоненты, просто получите компонент в позиции 0. Проверьте мой блог на макете перекрытия для более подробного описания того, как ZOrder завод.

Component visibleComponent = panelWithCardLayout.getComponent(0);

Edit2:

вышеуказанное редактирование неверно. ZOrder не имеет значения при использовании с CardLayout. Поэтому вы не можете просто получить компонент 0.


при осуществлении CardLayout.first() который должен установить верхнюю видимую карту, у вас есть следующее:

int ncomponents = parent.getComponentCount();
for (int i = 0 ; i < ncomponents ; i++) {
    Component comp = parent.getComponent(i);
    if (comp.isVisible()) {
        comp.setVisible(false);     // hide previously visible components
        break;
    }
}

if (ncomponents > 0) {
    currentCard = 0;
    parent.getComponent(0).setVisible(true);   // set visibility of component 0
    parent.validate();
}

Итак, я полагаю, вы можете получить "верхнюю карту"yourContainer.getComponent(0).


вы можете установить переменную, которая меняется в зависимости от видимости карты

int cardShow;

и затем вы устанавливаете свою карту видимой

cards.show(card1, "card1");
cardShow = 1;

и когда вы пытаетесь получить, какая карта видна, просто используйте

if (cardShow == 1)
//code in case of card1 is visible