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

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

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

编辑:代码段

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

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

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

编辑 :我试图获得顶级卡的原因是因为我有一个带有“添加”按钮的工具栏。 我没有为我的两个可能的东西添加一个按钮,而是希望通过查看当前正在查看的面板来知道要添加哪个按钮。 如果还有其他更合适的方法,请告诉我。

编辑 :谢谢大家的帮助。 我弄清楚问题是什么。 我想这是我的错,因为我没有提供足够的细节。 我的两张牌是JScrollPane ,我还需要查看其中的内容,看看其中一个面板是否是我看到的那个。 我没有检查滚动窗格本身上的isVisible() ,我一直在查看它始终可见的争议,滚动窗格是我需要validation的可见性。

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

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

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

编辑:

然后循环遍历组件,寻找ZOrder为0的组件。这是在顶部绘制的组件。 实际上,您甚至不必遍历所有组件,只需将组件放在位置0处。在Overlap Layout上查看我的博客,以获取有关ZOrder如何工作的更详细说明。

 Component visibleComponent = panelWithCardLayout.getComponent(0); 

EDIT2:

上面的编辑错了。 与CardLayout一起使用时,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