3

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

根据CardLayout 文档

使用 addLayoutComponent 翻转到使用指定名称添加到此布局的组件。如果不存在这样的组件,则不会发生任何事情。

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

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

4

2 回答 2

5

CardLayoutAPI 无法检查是否已经使用给定名称添加了组件。

如果您真的想这样做(但我强烈建议您不要这样做),那么您可以对容器使用的容器使用反射CardLayout并读取其vector字段,然后检查每个条目(类型CardLayout$Card为 )以获取给定名称。如您所见,这看起来像一个 hack,如果CardLayout有一天被重构,它可能会崩溃(当前的实现非常丑陋)。

最好的方法是让您直接跟踪某个Set<String>字段中所有添加的孩子的姓名。无论如何,这样做真的没什么大不了的。

于 2011-05-18T08:24:24.340 回答
4

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

  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();
            }
        });
    }
}
于 2011-05-18T15:19:13.893 回答