Java 无法在CardLayout中识别当前可见卡

Java 无法在CardLayout中识别当前可见卡,java,swing,layout-manager,classcastexception,cardlayout,Java,Swing,Layout Manager,Classcastexception,Cardlayout,我有一个JPanel,比如: public class CardLayoutPanel extends JPanel { String[] option = {"login", "register"} public CardLayoutPanel() { super(); combo_box = new JComboBox(option); login_panel = new LoginForm(); register_panel = new Regist

我有一个JPanel,比如:

public class CardLayoutPanel extends JPanel {
String[] option = {"login", "register"}    
public CardLayoutPanel() {
    super();
    combo_box = new JComboBox(option);
    login_panel = new LoginForm();
    register_panel = new RegisterForm();

    layout = new CardLayout();
    this.setLayout(new BorderLayout());
    panel = new JPanel();
    panel.setLayout(layout);

    this.add(combo_box, BorderLayout.NORTH);
    this.add(panel, BorderLayout.SOUTH);

    panel.add(login_panel, "login");
    panel.add(register_panel, "register");

    layout.show(panel, "login");
    combo_box.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            JComboBox source = (JComboBox) e.getSource();

            if(source.getSelectedItem().equals("login")) {
                layout.show(panel, "login");
            }else if(source.getSelectedItem().equals("register")) {
                layout.show(panel, "register");
            }
        }
    });
}
}

我从我的主窗户里打电话给你

CardLayoutPanel card_panel = new CardLayoutPanel();

    int res = JOptionPane.showConfirmDialog(null, card_panel, "Login/Registrati",JOptionPane.OK_CANCEL_OPTION);
现在,如果我尝试获取当前可见的卡片

if(res == JOptionPane.OK_OPTION) {
        for(Component comp : card_panel.getComponents()) {
            if(comp.isVisible() == true) {
                JPanel current_panel = (JPanel) comp;

                System.out.println(current_panel.getName());
            }
        }
    }else if(res == JOptionPane.CANCEL_OPTION) {
        System.exit(-1);
    }
我获得了后续错误:

线程“main”java.lang.ClassCastException中的异常:javax.swing.JComboBox无法转换为javax.swing.JPanel

在该行中,对于每条语句:

JPanel current_panel = (JPanel) comp;

如何修复它?

不确定您是否正确使用了CardLayout。我不知道为什么要将CardLayout添加到JOptionPane。我只想添加要显示的面板

但是如果你真的想知道当前在卡片布局中显示的卡片,那么请查看
它有一个方法来实现这一点。

我只需获取JComboBox并查询其所选项目。假设保存JComboBox的类有一个方法say,名为,
getComboBox()

或者,对于持有组合框的类来说,最好有一个方法,该方法不公开组合框本身,但允许其他类查询组合框中的选定项

public Object getComboBoxSelection() {
  combo_box.getSelectedItem();
}

然后外部类可以对有效引用调用此方法。

“我如何修复它?”
--不要将JComboBox强制转换为JPanel。将其转换为JComboBox并将其用作JComboBox。但为什么它将组件转换为JComboBox而不是Jpanel?
但为什么它将组件转换为JComboBox而不是Jpanel?
-您的代码是错误的,并且您没有发布SSCCE,因此我们无法告诉您错误所在。因为它不是Jpanel。您不应该在执行操作时查看组件,而应该使用引用变量来提取JComboBox,从而查询其状态。@giozh:Add
(comp instanceOf JPanel)&&(comp.isVisible())
到您的if条件中,我想它可以工作:-)
public Object getComboBoxSelection() {
  combo_box.getSelectedItem();
}