Вопрос

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

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

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

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

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

Редактировать: Я использую это как часть школьного назначения. Я не пытаюсь получить здесь Freebie, назначение не вращается вокруг этого макета. Похоже, что это самый удобный макет для изменения между панелями. Мой учитель указал, что в проекте нет стороннего кода. Я видел реализацию от ссылки 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;
    }
Это было полезно?

Решение

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

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

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

Component visibleComponent = panelWithCardLayout.getComponent(0);

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

Вышеуказанное редактирование неверно. Zorker не имеет смысла при использовании с 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top