我一直在查看Swing CardLayout的文档,似乎没有任何方法可以确定哪个卡当前显示在课程中。然而,必须有一种方法来询问布局当前显示哪张卡片,对吗?
由于项目限制,我不能简单地扩展它并将此功能添加到子类中,因此如果没有这样的功能,那就意味着我无法跟踪组件外部的组件状态(哎呀!),还是还有一些其他的选择埋藏在Swing的深处?
答案 0 :(得分:5)
<击>
从概念上讲,CardLayout管理的每个组件都像一个
扑克牌或交易卡在堆栈中,只有顶级卡
任何时候都可见。您可以选择任何一个中显示的卡片
以下方式:
尝试,
Component visibleComponent = foo.getComponent(0);
其中foo
是使用JPanel
的{{1}}实例。
参考:
答案 1 :(得分:3)
似乎没有直接的方法来知道哪张卡是活跃的。我的猜测是,这是一个设计决定,而不是一个错误。您有责任跟踪活动卡。
但是,我不太明白为什么你需要跟踪它。 Swing是基于事件的,当你得到一些事件时,你几乎知道哪张牌是活跃的。
答案 2 :(得分:2)
基础教程描述了如何切换cards in CardLayout,关于CardLayout the best are here或here
的大量示例来自我在此发布的链接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。