Как получить верхнюю карту в Java CardLayout - PullRequest
13 голосов
/ 10 декабря 2010

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

Редактировать: Под «верхней картой» я подразумеваю ту, которая в данный момент находится на «верхней» карте, а не первую или последнюю карты. Кроме того, я не знаю, помогает ли это, но я ищу JPanel (или его подкласс)

Редактировать: Фрагмент кода

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

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

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

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

Редактировать : Спасибо всем за помощь. Я понял, в чем проблема. Я предполагаю, что это была моя вина, так как я не предоставил достаточно деталей. Две мои карты JScrollPane с, и мне также нужно было просмотреть их содержимое, чтобы выяснить, была ли одна из этих панелей той, которую я видел. Я не проверял 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 ]

12 голосов
/ 11 декабря 2010

Если вы измените фрагмент кода, который вы добавили в вопрос, вы можете легко определить, какая карта видна. В моем тестовом фрейме, когда кнопка нажата, она печатает название видимой в данный момент карты, прежде чем перейти к следующей карте. Изменяя свой код, важно помнить, что вам нужно вызывать 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 () я напечатал название карты, но у вас есть ссылка на видимую в данный момент карту.

2 голосов
/ 11 декабря 2010

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

Редактировать:

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

Component visibleComponent = panelWithCardLayout.getComponent(0);

Edit2:

Указанное выше редактирование неверно.ZOrder не имеет смысла при использовании с CardLayout.Таким образом, вы не можете просто получить компонент 0.

0 голосов
/ 03 декабря 2014

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

, например

int cardShow;

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

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

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

if (cardShow == 1)
//code in case of card1 is visible
0 голосов
/ 11 декабря 2010

В реализации 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).

...