如何在Java的CardLayout中获得顶级卡片

ale*_*oco 13 java layout user-interface awt cardlayout

是否有可能在Java的CardLayout中获得顶级卡?我已经尝试循环遍历每个组件以检查isVisible()的可见性,但似乎它们都是"可见的".

编辑:通过"顶级卡"我的意思是当前处于"顶部"的那个,正在显示,而不是第一张或最后一张牌.另外,我不知道它是否有帮助,但我正在寻找一个JPanel(或其子类)

编辑:代码段

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

上面的代码总是打印出每个组件类的名称,无论它们是否是可见卡.

编辑:我将此作为学校作业的一部分.我不是想在这里获得免费赠品,作业并不围绕这种布局.它似乎是在面板之间切换最方便的布局.我的老师已经指定项目中没有第三方代码.我之前看过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;
    }
Run Code Online (Sandbox Code Playgroud)

rob*_*x44 12

如果您修改了添加到问题的代码段,则可以轻松判断哪个卡可见.在我的测试框架中,当按下按钮时,它会打印出当前可见卡片的名称,然后再翻转到下一张卡片.修改代码时,要记住的重要一点是,您需要在实际具有CardLayout的组件上调用getComponents().这样,只有一个孩子可见.我在你的代码中猜测你在包含带有CardLayout的JPanel的框架上调用getComponents.

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;
}
Run Code Online (Sandbox Code Playgroud)

在actionPerformed()方法中,我打印了卡片的名称,但您可以参考当前可见的卡片.