我一直在尋找通過的搖擺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