是否可以在Java的Cardlayout中获得顶级卡?我已经尝试循环浏览每个组件以检查是否可见(),但似乎它们都“可见”。

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

编辑:代码片段

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;
    }
有帮助吗?

解决方案

如果修改代码片段,则添加到问题中,您可以轻松地分辨出哪个卡是可见的。在我的测试框架中,按下按钮时,它会打印出当前可见的卡的名称,然后再翻转到下一张卡。修改代码,要牢记的重要一件事情是,您需要在实际具有纸牌套件的组件上调用getComponents()。这样,只有一个孩子可以看到。我猜想您在框架上调用getComponents,其中包含带有cardlayout的jpanel。

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()方法中,我打印了该卡的名称,但是您可以引用当前可见的卡。

其他提示

我扩展了纸牌套件以提供此类功能。看 卡布局焦点.

编辑:

然后循环循环循环,以寻找Zorder为0的组件。这是在顶部绘制的组件。实际上,您甚至不必迭代所有组件,只需在位置0中获取组件。在重叠布局上查看我的博客,以更详细地描述Zorder的工作方式。

Component visibleComponent = panelWithCardLayout.getComponent(0);

edit2:

以上编辑是错误的。 ZORDER与卡片套一起使用时没有意义。因此,您不能简单地获得组件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