2011-08-16 46 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 。

相關問題