2

我有一个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");
            }
        }
    });
}

}

我从 JOptionPane 中的主类调用

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

我得到后续错误:

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

在每个语句里面的这一行:

JPanel current_panel = (JPanel) comp;

我该如何解决?

4

2 回答 2

3

我会简单地获取 JComboBox 并查询其选定的项目。假设持有 JComboBox 的类有一个方法 say 称为getComboBox()

JComboBox combo = getComboBox();
String selectedItem = combo.getSelectedItem().toString();
System.out.println(selectedItem);

或者,对于拥有组合框的类来说,拥有一个不公开组合框本身但允许其他类查询组合框以获取所选项目的方法可能更好。

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

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

于 2013-07-27T18:04:08.630 回答
3

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

但是,如果您真的想知道 CardLayout 中当前显示的卡片,请查看 Card Layout Focus,它有一种方法可以做到这一点。

于 2013-07-27T17:06:39.333 回答