Как построить Java Главное меню
Очевидно, я пытаюсь сделать главное меню, используя компоненты свинга. Я понимаю, что для того, чтобы сделать мое меню, я должен использовать 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)
Я не понимаю, что я делаю неправильно. Буду признателен за любую помощь в этом заранее.
3 ответа
Нашел это!
Это был вопрос неправильного порядка:
Buttons();
panel.setLayout(layout);
layout.addLayoutComponent(panel, "Menu");
неправильно, потому что вам, очевидно, нужно настроить CardLayout в panel
прежде чем что-то делать (как show
) с этим. Так:
panel.setLayout(layout);
layout.addLayoutComponent(panel, "Menu");
Buttons();
Хотя я не знаю, зачем вам эта строка:
layout.addLayoutComponent(panel, "Menu");
Глядя на учебник, он не упоминает о необходимости его использования.
Также имена методов должны начинаться со строчной буквы, я на мгновение растерялся, думая, что Buttons
был класс. И вы должны использовать более описательные имена:
addButtons()
вместо Buttons()
gamePanel
вместо game
и так далее.
Хорошая работа, предоставляя (не очень обширный) соответствующий код, в следующий раз вы должны попробовать добавить main
также, чтобы мы могли просто выполнить и проверить это:)
Попробуйте поменять местами эти строки...
panel.setLayout(layout);
addButtons();
В основном, когда вы пытаетесь и show
первый экран, CardLayout
не связано с вашим panel
что, очевидно, является недействительным родителем
Проверьте этот URL и узнайте все, что вам нужно знать о меню в Java Swing. Он полон примеров кода. Надеюсь это поможет. Как использовать меню