我有一张CardLayout,我只根据需要添加卡片。因此,当需要显示特定卡(由其名称标识)时,我需要一种方法来检查具有该名称的卡是否已经存在,以便我可以相应地显示或创建它。
使用addLayoutComponent翻转到使用指定名称添加到此布局的组件。如果不存在这样的组件,则没有任何反应。
因此,如果我要求它显示尚未添加的卡,则不会抛出任何错误。我找不到任何可以让我检查卡是否存在的API。
那么,这可能吗?如果不是如何解决这个问题呢?有一个解决方案,我手动记住我添加了哪些卡,但感觉摇摆应该能够处理这个。
答案 0 :(得分:4)
CardLayout
API无法检查是否已使用给定名称添加了某个组件。
如果您真的想这样做(但我强烈建议反对这样做),那么您可以在CardLayout
使用的vector
上使用反射容器,并读取其CardLayout$Card
字段,然后检查给定名称的每个条目(类型CardLayout
)。如你所见,这看起来像一个黑客,如果Set<String>
有一天被重构(当前的实现非常难看),它可能会破坏。
最好的方法是直接跟踪{{1}}字段中所有已添加子项的名称。无论如何,这真的没什么大不了的。
答案 1 :(得分: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();
}
});
}
}