我一直在寻找通过的摇摆CardLayout的文档,有没有出现任何方法来确定哪些卡是目前显示的类烘烤。然而,必须有方法来询问它当前显示哪张牌的布局,对吗?CardLayouts:我怎样才能知道哪些卡是可见的?
由于项目的限制,我不能简单地扩展它,并添加此功能的子类,所以如果没有这样的功能,这是否意味着我坚持跟踪组件的状态外部组件(yuck!),还是有其他选择埋在Swing深处的某个地方?
我一直在寻找通过的摇摆CardLayout的文档,有没有出现任何方法来确定哪些卡是目前显示的类烘烤。然而,必须有方法来询问它当前显示哪张牌的布局,对吗?CardLayouts:我怎样才能知道哪些卡是可见的?
由于项目的限制,我不能简单地扩展它,并添加此功能的子类,所以如果没有这样的功能,这是否意味着我坚持跟踪组件的状态外部组件(yuck!),还是有其他选择埋在Swing深处的某个地方?
按照
How to Use CardLayout教程,
指定卡概念,每一个CardLayout管理组件,就像是一个堆栈,其中只有顶部卡在任何时候 可见 扑克牌或交易卡。您可以选择在任何 通过以下方式显示卡:
通过询问第一或最后一张牌,它被添加到容器通过顺序 通过甲板翻转向后或向前通过具有特定名称
尝试,
Component visibleComponent = foo.getComponent(0);
其中foo
是使用CardLayout
的JPanel
实例。
参考:
基础教程descibed如何从链接,我贴在这里How to get the top card in Java's CardLayout
切换中间人 cards in CardLayout,大量的例子约CardLayout the best are here或 here或更好的方法
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");
}
}
这不会试图回答这个问题。 –
它似乎没有直接的方法来知道哪些卡是有效的。我的猜测是,这是一个设计决定,而不是一个错误。您有责任跟踪活动卡。
不过,我不太明白为什么你需要跟踪它。 Swing是基于事件的,你几乎知道当你得到一些事件,这卡是有效的。
这里所选的答案给出了添加到CardLayout第一成分,我不认为这是用户问。有一个简单的方式通过通过迭代CardLayout的组件找到的可视面板:
for(Component comp : cardPanel.getComponents()) {
if (comp.isVisible()) {
return (JPanel)comp;
}
}
把这个在方法返回一个组件
Component getVisibleCard() { ... }
将使你获得当前显示的Component 。
在回答之前请仔细阅读问题:我了解如何显示特定的卡片,我有兴趣通过对组件本身的调用来确定显示哪张卡片,而不是从外部跟踪其状态。 –
你能更具体吗?阅读完您提供的链接后,我找不到您指的是什么? –
@汤姆,你是对的。我误读了教程 - 我的错。看我的编辑。 – mre