2011-08-16 47 views
6

我一直在寻找通过的摇摆CardLayout的文档,有没有出现任何方法来确定哪些卡是目前显示的类烘烤。然而,必须有方法来询问它当前显示哪张牌的布局,对吗?CardLayouts:我怎样才能知道哪些卡是可见的?

由于项目的限制,我不能简单地扩展它,并添加此功能的子类,所以如果没有这样的功能,这是否意味着我坚持跟踪组件的状态外部组件(yuck!),还是有其他选择埋在Swing深处的某个地方?

回答

5

按照 How to Use CardLayout教程,

概念,每一个CardLayout管理组件,就像是一个堆栈,其中只有顶部卡在任何时候 可见 扑克牌或交易卡。您可以选择在任何 通过以下方式显示卡:

  • 通过询问第一或最后一张牌,它被添加到容器
  • 通过顺序 通过甲板翻转向后或向前
  • 通过具有特定名称
指定卡

尝试,

Component visibleComponent = foo.getComponent(0); 

其中foo是使用CardLayoutJPanel实例。

参考:

+0

在回答之前请仔细阅读问题:我了解如何显示特定的卡片,我有兴趣通过对组件本身的调用来确定显示哪张卡片,而不是从外部跟踪其状态。 –

+0

你能更具体吗?阅读完您提供的链接后,我找不到您指的是什么? –

+1

@汤姆,你是对的。我误读了教程 - 我的错。看我的编辑。 – mre

2

基础教程descibed如何从链接,我贴在这里How to get the top card in Java's CardLayout

切换中间人 cards in CardLayout,大量的例子约CardLayout the best are herehere

或更好的方法

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.event.HierarchyEvent; 
import java.awt.event.HierarchyListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.event.AncestorEvent; 
import javax.swing.event.AncestorListener; 

public class CardlayoutTest extends JFrame { 

    private static final long serialVersionUID = 1L; 
    public CardLayout card = new CardLayout(); 

    public CardlayoutTest() { 
     EventHandler eventHandle = new EventHandler(); 
     JPanel pnlA = new JPanel(new BorderLayout()); 
     pnlA.add(new JButton("A"), BorderLayout.CENTER); 
     JPanel pnlB = new JPanel(new BorderLayout()); 
     pnlB.add(new JButton("B"), BorderLayout.CENTER); 
     pnlA.addAncestorListener(eventHandle); 
     pnlA.addHierarchyListener(eventHandle); 
     pnlB.addAncestorListener(eventHandle); 
     pnlB.addHierarchyListener(eventHandle); 
     setLayout(card); 
     add(pnlA, "A"); 
     add(pnlB, "B"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    class EventHandler implements AncestorListener, HierarchyListener { 

     @Override 
     public void ancestorAdded(AncestorEvent event) { 
      System.out.println("CardlayoutTest.EventHandler.ancestorAdded()"); 
     } 

     @Override 
     public void ancestorMoved(AncestorEvent event) { 
      System.out.println("CardlayoutTest.EventHandler.ancestorMoved()"); 
     } 

     @Override 
     public void ancestorRemoved(AncestorEvent event) { 
      System.out.println("CardlayoutTest.EventHandler.ancestorRemoved()"); 
     } 

     @Override 
     public void hierarchyChanged(HierarchyEvent e) { 
      System.out.println("CardlayoutTest.EventHandler.hierarchyChanged()"); 
     } 
    } 

    public static void main(String[] args) { 
     CardlayoutTest t = new CardlayoutTest(); 
     t.setSize(500, 500); 
     System.out.println("CardlayoutTest.main()------------------------ FIRST"); 
     t.card.show(t.getContentPane(), "A"); 
     t.setVisible(true); 
     System.out.print("\n"); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
     } 
     System.out.println("CardlayoutTest.main()------------------------ SECOND"); 
     t.card.show(t.getContentPane(), "B"); 
     System.out.print("\n"); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
     } 
     System.out.println("CardlayoutTest.main()------------------------ THIRD"); 
     t.card.show(t.getContentPane(), "B"); 
     System.out.print("\n"); 
    } 
} 
+1

这不会试图回答这个问题。 –

3

它似乎没有直接的方法来知道哪些卡是有效的。我的猜测是,这是一个设计决定,而不是一个错误。您有责任跟踪活动卡。

不过,我不太明白为什么你需要跟踪它。 Swing是基于事件的,你几乎知道当你得到一些事件,这卡是有效的。

0

这里所选的答案给出了添加到CardLayout第一成分,我不认为这是用户问。有一个简单的方式通过通过迭代CardLayout的组件找到的可视面板:

for(Component comp : cardPanel.getComponents()) { 
    if (comp.isVisible()) { 
     return (JPanel)comp; 
    } 
} 

把这个在方法返回一个组件

Component getVisibleCard() { ... } 

将使你获得当前显示的Component 。

相关问题