Как построить 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. Он полон примеров кода. Надеюсь это поможет. Как использовать меню

Другие вопросы по тегам