2011-05-18 127 views
2

我有一張CardLayout,只在需要時添加名片。因此,當需要顯示特定卡片(通過其名稱標識)時,我需要一種方法來檢查具有該名稱的卡片是否已經存在,以便我可以相應地顯示或創建該卡片。檢查名片中是否存在CardLayout

按照CardLayout documentation

翻轉到已加入到該佈局具有指定名稱使用addLayoutComponent的組件。如果不存在這樣的組件,則什麼都不會發生。

因此,如果我要求它顯示尚未添加的卡,則不會引發錯誤。我找不到任何可以讓我檢查卡是否存在的API。

那麼,這可能嗎?如果不是,如何解決這個問題呢?有解決方案,我手動記住我添加了什麼牌,但感覺揮杆應該能夠處理這個。

+0

我認爲,姓名(或名稱)是有方法秀()http://download.oracle.com/javase/7/docs/api/java/awt/CardLayout。 html#show%28java.awt.Container,%20java.lang.String%29 from http://download.oracle.com/javase/tutorial/uiswing/layout/card.html – mKorbel 2011-05-18 07:06:15

+0

@mKorbel,我不確定我我懂了。 'show()'方法獲取名稱並顯示與該名稱關聯的卡片。我的問題是如何檢查與特定名稱相關聯的卡是否存在。 – 2011-05-18 07:14:02

+0

@ Shrikant Sharat請在'CAREERS2.2'下面的右側檢查'Related'主題,我在這裏找到f.e. http://stackoverflow.com/questions/2998538/switching-between-cards-in-a-cardlayout-using-getparent – mKorbel 2011-05-18 07:40:58

回答

3

CardLayout API不提供檢查組件是否已添加給定名稱的方法。

如果你真的想這樣做(但我會強烈建議反對這樣做),那麼你可以在容器使用的CardLayout使用反射,並閱讀其vector場,然後檢查每個條目(給定名稱的類型爲CardLayout$Card)。正如你所看到的那樣,這看起來像一個黑客,如果有一天CardLayout被重構,它可能會破壞(當前的實現非常難看)。

最好的方法是直接跟蹤Set<String>字段中所有添加的孩子的姓名。無論如何,這並不是什麼大不了的事情。

+0

噢,我絕對不想去反思事物的方式,因爲你的理由建議。猜猜我會繼續跟蹤自己。感謝您的反思想法btw :) – 2011-05-18 08:38:37

+1

不客氣。看看CardLayout的「膽量」是很有趣的;-) – jfpoilpret 2011-05-18 09:05:31

3

因此,當需要顯示特定卡片(由其名稱標識)時,我需要一種方法來檢查具有該名稱的卡片是否已經存在,以便我可以相應地顯示或創建它。

  1. 獲取顯示在容器
  2. 試圖展現出不同的卡
  3. 獲取組件現在顯示在容器中的電流分量
  4. 如果這兩個組件都是一樣的,沒有什麼發生了,您需要創建該卡並將其添加到容器中。

這種方法可以節省您自己管理套卡。

編輯:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class CardLayoutTest implements ActionListener 
{ 
    JPanel cards; 

    public void addComponentToPane(Container pane) { 
     JPanel comboBoxPane = new JPanel(); 
     String comboBoxItems[] = { "Red", "Orange", "Green", "Yellow", "Blue"}; 
     JComboBox cb = new JComboBox(comboBoxItems); 
     cb.setEditable(false); 
     cb.addActionListener(this); 
     comboBoxPane.add(cb); 

     cards = new JPanel(new CardLayout()); 

     pane.add(comboBoxPane, BorderLayout.PAGE_START); 
     pane.add(cards, BorderLayout.CENTER); 

     JPanel red = new JPanel(); 
     red.setBackground(Color.RED); 
     red.setPreferredSize(new Dimension(200, 50)); 
     cards.add(red, "Red"); 

     JPanel green = new JPanel(); 
     green.setBackground(Color.GREEN); 
     green.setPreferredSize(new Dimension(200, 50)); 
     cards.add(green, "Green"); 

     JPanel blue = new JPanel(); 
     blue.setBackground(Color.BLUE); 
     blue.setPreferredSize(new Dimension(200, 50)); 
     cards.add(blue, "Blue"); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     Component visible = getVisibleCard(); 

     JComboBox comboBox = (JComboBox)e.getSource(); 
     String item = comboBox.getSelectedItem().toString(); 
     CardLayout cl = (CardLayout)(cards.getLayout()); 
     cl.show(cards, item); 

     // change code below to create and show your card. 

     if (visible == getVisibleCard()) 
      JOptionPane.showMessageDialog(cards, "Card (" + item + ") not found"); 

    } 

    private Component getVisibleCard() 
    { 
     for(Component c: cards.getComponents()) 
     { 
      if (c.isVisible()) 
       return c; 
     } 

     return null; 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("CardLayoutTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     CardLayoutTest demo = new CardLayoutTest(); 
     demo.addComponentToPane(frame.getContentPane()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

好主意。但是,我沒有找到任何API來從CardLayout實例中獲取顯示的組件。 – 2011-05-19 01:34:33

+0

您不能從CardLayout獲取它,只需使用panel.getComponent(0)直接從面板獲取組件。 – camickr 2011-05-19 02:10:06

+0

啊,我明白了。我會試試這個(我已經實現了其他解決方案:)。感謝您的想法 – 2011-05-19 04:36:16