检查CardLayout中是否存在名称中的卡

时间:2011-05-18 06:59:19

标签: java swing cardlayout

我有一张CardLayout,我只根据需要添加卡片。因此,当需要显示特定卡(由其名称标识)时,我需要一种方法来检查具有该名称的卡是否已经存在,以便我可以相应地显示或创建它。

根据CardLayout documentation

  

使用addLayoutComponent翻转到使用指定名称添加到此布局的组件。如果不存在这样的组件,则没有任何反应。

因此,如果我要求它显示尚未添加的卡,则不会抛出任何错误。我找不到任何可以让我检查卡是否存在的API。

那么,这可能吗?如果不是如何解决这个问题呢?有一个解决方案,我手动记住我添加了哪些卡,但感觉摇摆应该能够处理这个。

2 个答案:

答案 0 :(得分:4)

CardLayout API无法检查是否已使用给定名称添加了某个组件。

如果您真的想这样做(但我强烈建议反对这样做),那么您可以在CardLayout使用的vector上使用反射容器,并读取其CardLayout$Card字段,然后检查给定名称的每个条目(类型CardLayout)。如你所见,这看起来像一个黑客,如果Set<String>有一天被重构(当前的实现非常难看),它可能会破坏。

最好的方法是直接跟踪{{1}}字段中所有已添加子项的名称。无论如何,这真的没什么大不了的。

答案 1 :(得分:4)

  

因此,当需要显示特定卡(由其名称标识)时,我需要一种方法来检查具有该名称的卡是否已经存在,以便我可以相应地显示或创建它。

  1. 获取容器中显示的当前组件
  2. 尝试显示其他卡
  3. 获取现在显示在容器中的组件
  4. 如果两个组件相同,则没有任何反应,您需要创建卡并将其添加到容器中。
  5. 这种方法可以帮助您自己管理这套卡片。

    编辑:

    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();
                }
            });
        }
    }