2010-12-10 50 views
13

是否有可能獲得Java CardLayout中的頂級卡片? 我試着循環遍歷每個組件來檢查isVisible()的可見性,但似乎它們都是「可見的」。如何獲得Java CardLayout中的頂級卡片

編輯:通過「頂牌」我的意思是當前在「頂部」,正在顯示,而不是第一張或最後一張牌。另外,我不知道,但如果它幫助我在尋找一個JPanel(或其子類)

編輯:代碼片斷

for (Component component : getComponents()) { 
if (component instanceof JPanel && component.isVisible()) { 
    currentPanel = (JPanel) component; 
    System.out.println(currentPanel.getClass().getName()); 
} 
} 

上面的代碼總是打印出的每個組件類的名字,無論他們是否是可見的卡片。

編輯:我將此作爲學校作業的一部分。我不想在這裏獲得免費贈品,這項任務並不是圍繞這種佈局。它似乎是用於在面板之間切換的最方便的佈局。我的老師已經指定項目中不會有第三方代碼。我以前看過camickr鏈接的實現,但我無法使用它。我可以鬆散地實現它的類似功能,也許可以在文檔中提供參考,但我不能簡單地下載並使用它。

編輯:我想獲得頂牌的原因是因爲我有一個帶有「添加」按鈕的工具欄。我只想通過查看當前正在查看的面板知道要添加哪個按鈕,而不是爲我的兩個可能的事情中的每一個都添加一個按鈕。如果還有其他更適合的方法,請告訴我。

編輯:謝謝大家的幫助。我找出了問題所在。我想這是我的錯,因爲我沒有提供足夠的細節。我的兩張卡是JScrollPane,我還需要查看其內容,以確定這些面板之一是否是我所看到的。我沒有檢查滾動窗格本身的isVisible(),我一直在看它的爭論總是可見的,它是我需要驗證的可見性的滾動窗格。

public JPanel getCurrentPanel() { 
     JPanel currentPanel = null; 

     for (Component component : getComponents()) { 
      if (component.isVisible()) { 
       if (component instanceof JPanel) 
        currentPanel = (JPanel) component; 
       else if (component instanceof JScrollPane) 
        currentPanel = (JPanel) ((JScrollPane) component).getViewport().getComponent(0); 
      } 
     } 

     return currentPanel; 
    } 

回答

11

如果您修改了添加到問題中的代碼段,則可以輕鬆分辨哪些卡可見。在我的測試框中,當按下按鈕時,它將打印出當前可見卡的名稱,然後翻到下一張卡。修改你的代碼,需要記住的重要一點是你需要在實際上具有CardLayout的組件上調用getComponents()。這樣,只有其中一個孩子可見。我在你的代碼中猜測你正在使用CardLayout在包含你的JPanel的框架上調用getComponents。

class TestFrame 
     extends JFrame 
     implements ActionListener 
{ 
    public TestFrame() 
    { 
     cards = new JPanel(new CardLayout()); 
     card_list = new JPanel[5]; 

     for (int i = 0; i < card_list.length; i++) { 
      String text = "Card " + i; 
      JPanel card = createCard(text); 
      card_list[i] = card; 
      cards.add(card, text); 
     } 

     add(cards); 
    } 

public JPanel getCurrentCard() 
{ 
    JPanel card = null; 

    for (Component comp : cards.getComponents()) { 
     if (comp.isVisible() == true) { 
      card = (JPanel)comp; 
      System.out.println(card.getName()); 
     } 
    } 
    System.out.println(); 

    return card; 
} 

public void actionPerformed(ActionEvent evt) 
{ 
    JPanel card = getCurrentCard(); 

    CardLayout cl = (CardLayout)(cards.getLayout()); 
    cl.next(cards); 
} 

    public JPanel createCard(String text) 
    { 
     JPanel card = new JPanel(); 
     card.setName(text); 

     JButton btn = new JButton(text); 
     btn.addActionListener(this); 

     card.add(btn); 
     return card; 
    } 

    JPanel cards; 
    JPanel[] card_list; 
} 

在actionPerformed()方法,我印在卡片的名字,但你必須將當前顯示卡的參考。

+0

@RD,代碼片段來自嘗試使用CardLayout的JPanel中的getCurrentPanel()方法。我爲其他原因擴展了JPanel,所以我可以訪問它。 – alexcoco 2010-12-10 22:09:55

+0

好吧,沒有看到你所有的代碼,我不能告訴你出了什麼問題,但我可以告訴你,我的TestFrame代碼一次只能正確找到一張可見卡。 – 2010-12-10 22:11:55

+0

@alexcoco,編輯將相關代碼放入getCurrentCard()方法中。 – 2010-12-10 22:18:38

0

在這應該設置頂卡可見你有以下的CardLayout.first()實現:

int ncomponents = parent.getComponentCount(); 
for (int i = 0 ; i < ncomponents ; i++) { 
    Component comp = parent.getComponent(i); 
    if (comp.isVisible()) { 
     comp.setVisible(false);  // hide previously visible components 
     break; 
    } 
} 

if (ncomponents > 0) { 
    currentCard = 0; 
    parent.getComponent(0).setVisible(true); // set visibility of component 0 
    parent.validate(); 
} 

,所以我想你可以yourContainer.getComponent(0)得到「頂證」的持有。

+0

對不起,我不是第一張牌。我更新了這個問題。 – alexcoco 2010-12-10 21:05:43

+2

啊。我的錯。它看起來像你應該能夠遍歷組件,並尋找'isVisible'一個雖然...你確定這是行不通的? – aioobe 2010-12-10 21:07:12

+0

是啊,即使可見卡已經改變,循環顯示所有值並打印該值總是會留下最後一張卡。我會在一秒鐘內更新一段代碼。 – alexcoco 2010-12-10 21:09:16

2

我擴展了CardLayout以提供這種類型的功能。見Card Layout Focus

編輯:

然後依次通過尋找與0這是一個ZORDER的構成元素的組成部分是在上面畫了一個。實際上,您甚至不必遍歷所有組件,只需在位置0處獲取組件即可。請參閱Overlap Layout上的我的博客,以獲取有關ZOrder如何工作的更詳細說明。

Component visibleComponent = panelWithCardLayout.getComponent(0); 

EDIT2:

以上的編輯是錯誤的。使用CardLayout時,ZOrder沒有意義。所以你不能簡單地獲得組件0。

+0

是的,我以前見過這個。但我不能那樣做。我會在一秒鐘之內用一個解釋來更新這個問題。 – alexcoco 2010-12-10 21:10:21

+0

@alexcoco,請參閱編輯。 – camickr 2010-12-10 21:15:18

+0

現在看着它,謝謝 – alexcoco 2010-12-10 21:18:54

-1

您可以設置根據存儲卡的知名度

例如的變化而變化

int cardShow; 

然後設置你的卡可見

cards.show(card1, "card1"); 
cardShow = 1; 

,當你試圖讓該卡是可見的只是使用

if (cardShow == 1) 
//code in case of card1 is visible 
相關問題