Java 无法在CardLayout中识别当前可见卡
我有一个JPanel,比如: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
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();
}