CardLayouts:我怎么知道哪张卡可见?

时间:2011-08-16 13:17:55

标签: java swing

我一直在查看Swing CardLayout的文档,似乎没有任何方法可以确定哪个卡当前显示在课程中。然而,必须有一种方法来询问布局当前显示哪张卡片,对吗?

由于项目限制,我不能简单地扩展它并将此功能添加到子类中,因此如果没有这样的功能,那就意味着我无法跟踪组件外部的组件状态(哎呀!),还是还有一些其他的选择埋藏在Swing的深处?

4 个答案:

答案 0 :(得分:5)

根据How to Use CardLayout教程,

<击>   

从概念上讲,CardLayout管理的每个组件都像一个   扑克牌或交易卡在堆栈中,只有顶级卡   任何时候都可见。您可以选择任何一个中显示的卡片   以下方式:

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

尝试,

Component visibleComponent = foo.getComponent(0);

其中foo是使用JPanel的{​​{1}}实例。

参考:

答案 1 :(得分:3)

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

但是,我不太明白为什么你需要跟踪它。 Swing是基于事件的,当你得到一些事件时,你几乎知道哪张牌是活跃的。

答案 2 :(得分:2)

基础教程描述了如何切换cards in CardLayout,关于CardLayout the best are herehere

的大量示例

来自我在此发布的链接How to get the top card in Java's CardLayout

或更好的方式

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

答案 3 :(得分:0)

这里选择的答案给出了添加到CardLayout的第一个组件,我不认为用户在询问的是什么。有一种简单的方法可以通过迭代CardLayout的组件来找到可见的面板:

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

将此放在返回Component

的方法中
Component getVisibleCard() { ... }

允许您获取当前显示的Component。