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

2022-09-04 21:15:42

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

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

编辑:代码片段

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

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

编辑:我正在将其用作学校作业的一部分。我不是想在这里获得免费赠品,任务不是围绕这个布局。它似乎是在面板之间切换的最方便的布局。我的老师已经指定项目中没有第三方代码。我以前看过camickr链接的实现,但我不能使用它。我可以松散地实现类似的功能,也许可以在文档中提供参考,但我不能简单地下载和使用它。

编辑:我试图获得顶部卡片的原因是因为我有一个带有“添加”按钮的工具栏。而不是为我的两个可能的事情中的每一个都有一个添加按钮,我希望它通过查看当前正在查看的面板来知道要添加哪个。如果有另一种更合适的方法可以做到这一点,请告诉我。

编辑:感谢大家的帮助。我弄清楚了问题所在。我想这是我的错,因为我没有提供足够的细节。我的两张卡片是s,我还需要查看其内容,以确定其中一个面板是否是我看到的面板。我没有在滚动窗格本身上检查,我一直在看它总是可见的争论,这是滚动窗格,我需要验证它的可见性。JScrollPaneisVisible()

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;
    }

答案 1

如果您修改添加到问题的代码片段,则可以轻松分辨出哪张卡是可见的。在我的测试帧中,当按下按钮时,它会打印出当前可见卡的名称,然后再翻转到下一张卡。修改代码时,要记住的重要一点是,您需要在实际具有CardLayout的组件上调用getComponents()。这样,只有一个子项是可见的。我猜在你的代码中,你在包含你的JPanel和CardLayout的框架上调用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;
}

在 actionPerformed() 方法中,我打印了卡的名称,但您具有对当前可见卡的引用。


答案 2

我扩展了CardLayout以提供这种类型的功能。请参阅卡片布局焦点

编辑:

然后循环遍历组件,查找 ZOrder 为 0 的组件。这是画在上面的那幅。实际上,您甚至不必遍历所有组件,只需将组件放在位置 0 即可。查看我在重叠布局上的博客,了解有关ZOrder如何工作的更详细说明。

Component visibleComponent = panelWithCardLayout.getComponent(0);

编辑2:

上面的编辑是错误的。ZOrder在与CardLayout一起使用时没有任何意义。因此,您不能简单地获取组件 0。