2010-12-10 26 views
13

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

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

编辑:代码片断

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

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

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

编辑:我想获得顶牌的原因是因为我有一个带有“添加”按钮的工具栏。我只想通过查看当前正在查看的面板知道要添加哪个按钮,而不是为我的两个可能的事情中的每一个都添加一个按钮。如果还有其他更适合的方法,请告诉我。

编辑:谢谢大家的帮助。我找出了问题所在。我想这是我的错,因为我没有提供足够的细节。我的两张卡是JScrollPane,我还需要查看其内容,以确定这些面板之一是否是我所看到的。我没有检查滚动窗格本身的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; 
    } 

回答

11

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

+0

@RD,代码片段来自尝试使用CardLayout的JPanel中的getCurrentPanel()方法。我为其他原因扩展了JPanel,所以我可以访问它。 – alexcoco 2010-12-10 22:09:55

+0

好吧,没有看到你所有的代码,我不能告诉你出了什么问题,但我可以告诉你,我的TestFrame代码一次只能正确找到一张可见卡。 – 2010-12-10 22:11:55

+0

@alexcoco,编辑将相关代码放入getCurrentCard()方法中。 – 2010-12-10 22:18:38

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)得到“顶证”的持有。

+0

对不起,我不是第一张牌。我更新了这个问题。 – alexcoco 2010-12-10 21:05:43

+2

啊。我的错。它看起来像你应该能够遍历组件,并寻找'isVisible'一个虽然...你确定这是行不通的? – aioobe 2010-12-10 21:07:12

+0

是啊,即使可见卡已经改变,循环显示所有值并打印该值总是会留下最后一张卡。我会在一秒钟内更新一段代码。 – alexcoco 2010-12-10 21:09:16

2

我扩展了CardLayout以提供这种类型的功能。见Card Layout Focus

编辑:

然后依次通过寻找与0这是一个ZORDER的构成元素的组成部分是在上面画了一个。实际上,您甚至不必遍历所有组件,只需在位置0处获取组件即可。请参阅Overlap Layout上的我的博客,以获取有关ZOrder如何工作的更详细说明。

Component visibleComponent = panelWithCardLayout.getComponent(0); 

EDIT2:

以上的编辑是错误的。使用CardLayout时,ZOrder没有意义。所以你不能简单地获得组件0。

+0

是的,我以前见过这个。但我不能那样做。我会在一秒钟之内用一个解释来更新这个问题。 – alexcoco 2010-12-10 21:10:21

+0

@alexcoco,请参阅编辑。 – camickr 2010-12-10 21:15:18

+0

现在看着它,谢谢 – alexcoco 2010-12-10 21:18:54

-1

您可以设置根据存储卡的知名度

例如的变化而变化

int cardShow; 

然后设置你的卡可见

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

,当你试图让该卡是可见的只是使用

if (cardShow == 1) 
//code in case of card1 is visible 
相关问题