显然我正在尝试使用swing组件制作主菜单。我了解为了让我的菜单发生,我必须使用CardLayout
,我在下面的代码中这样做:
(一切都是导入的)
public class Screen extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
int width, height;
JButton play = new JButton("play");
JButton settings = new JButton("settings");
JButton exit = new JButton("exit");
JButton mainMenu = new JButton("main menu");
CardLayout layout = new CardLayout();
JPanel panel = new JPanel();
JPanel game = new JPanel();
JPanel menu = new JPanel();
public Screen(int width, int height) {
this.width = width;
this.height = height;
panel.setLayout(layout);
addButtons();
setSize(width, height);
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
setTitle("BUILD YOUR EMPIRE");
setDefaultCloseOperation(EXIT_ON_CLOSE);
requestFocus();
}
private void addButtons() {
play.addActionListener(this);
settings.addActionListener(this);
exit.addActionListener(this);
mainMenu.addActionListener(this);
//menu buttons
menu.add(play);
menu.add(settings);
menu.add(exit);
//game buttons
game.add(mainMenu);
//background colors
game.setBackground(Color.MAGENTA);
menu.setBackground(Color.GREEN);
//adding children to parent Panel
panel.add(menu,"Menu");
panel.add(game,"Game");
add(panel);
layout.show(panel,"Menu");
}
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if (source == exit) {
System.exit(0);
} else if (source == play) {
layout.show(panel, "Game");
} else if (source == settings){
} else if (source == mainMenu){
layout.show(panel, "Menu");
}
}
}
但是当我运行它时,只有退出按钮有效。 当我点击设置按钮时没有任何反应(按预期) 但是当我点击播放按钮时它会崩溃并给我这个错误:
Exception in thread "main" java.lang.IllegalArgumentException: wrong parent for CardLayout
at java.awt.CardLayout.checkLayout(Unknown Source)
at java.awt.CardLayout.show(Unknown Source)
at Screen.Buttons(Screen.java:69)
at Screen.<init>(Screen.java:31)
at Window.main(Window.java:29)
我不明白我做错了什么。 任何有关此方面的帮助都将在此事先得到非常感谢。
答案 0 :(得分:2)
发现它!
这是一个错误的顺序问题:
Buttons();
panel.setLayout(layout);
layout.addLayoutComponent(panel, "Menu");
是错误的,因为您显然需要在panel
之前设置CardLayout,然后再对其进行任何操作(如show
)。所以:
panel.setLayout(layout);
layout.addLayoutComponent(panel, "Menu");
Buttons();
虽然我不知道你为什么需要这条线:
layout.addLayoutComponent(panel, "Menu");
查看tutorial它没有提到使用它的必要性。
方法名称也应该以小写字母开头,我很困惑,认为Buttons
是一个类。您应该使用更具描述性的名称:
addButtons()
代替Buttons()
gamePanel
代替game
等等。
提供(不是非常广泛的)相关代码的好工作,下次你应该尝试添加main
,这样我们就可以执行并测试它了:)
答案 1 :(得分:0)
尝试交换这些行...
panel.setLayout(layout);
addButtons();
基本上,当您尝试show
第一个屏幕时,CardLayout
与您的panel
无关,显然,这是一个无效的父母
答案 2 :(得分:-1)
检查此URL并了解Java Swing中有关菜单的所有信息。它充满了代码示例。希望这可以帮助。 How to Use Menus