13

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

编辑:“顶牌”是指当前位于“顶部”的正在显示的牌,而不是第一张或最后一张牌。另外,我不知道它是否有帮助,但我正在寻找一个 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;
    }
4

4 回答 4

13

如果您修改添加到问题中的代码片段,您可以轻松判断哪张卡片是可见的。在我的测试框架中,当按下按钮时,它会打印出当前可见卡片的名称,然后再翻转到下一张卡片。修改您的代码,要记住的重要一点是您需要在实际具有 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;
}

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

于 2010-12-10T21:50:11.820 回答
2

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

编辑:

然后遍历组件以查找 ZOrder 为 0 的组件。这是在顶部绘制的组件。实际上,您甚至不必遍历所有组件,只需在位置 0 处获取组件即可。查看我关于重叠布局的博客,以更详细地描述 ZOrder 的工作原理。

Component visibleComponent = panelWithCardLayout.getComponent(0);

编辑2:

上面的编辑是错误的。ZOrder 与 CardLayout 一起使用时没有任何意义。所以你不能简单地得到组件 0。

于 2010-12-10T21:08:44.087 回答
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).

于 2010-12-10T21:02:50.727 回答
-1

您可以设置根据卡片可见性而变化的变量

例如

int cardShow;

然后你设置你的卡可见

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

当您尝试获取可见的卡时,只需使用

if (cardShow == 1)
//code in case of card1 is visible
于 2014-12-02T22:57:51.890 回答