java - 如何构建 java 主菜单

标签 java swing menu program-entry-point cardlayout

显然我正在尝试使用 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)

我不明白我做错了什么。 对此的任何帮助将不胜感激,提前致谢。

最佳答案

找到了!

这是一个错误的顺序问题:

Buttons();
panel.setLayout(layout);        
layout.addLayoutComponent(panel, "Menu");

是错误的,因为您显然需要在使用 CardLayout 执行任何操作(例如 show)之前在 panel 中设置它。所以:

panel.setLayout(layout);        
layout.addLayoutComponent(panel, "Menu");
Buttons();

虽然我不知道你为什么需要这条线:

layout.addLayoutComponent(panel, "Menu");

查看tutorial它没有提到使用它的必要性。

方法名称也应该以小写开头,我有一段时间很困惑,认为 Buttons 是一个类。并且您应该使用更具描述性的名称:

addButtons() 而不是 Buttons()

gamePanel 而不是 game

等等。

干得好,提供(不是很广泛)相关代码,下次您应该尝试添加 main ,这样我们就可以执行和测试它:)

关于java - 如何构建 java 主菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23034675/

相关文章:

java - 选项卡式设计中的 ListView 空指针

Java内部类的使用和实例化

menu - oracle apex 5 - 如何重新排序菜单中的页面

java - 用Java程序读取Java的属性文件

java - 无法使用 ColdFusion 验证 SAML 断言

java - 检查JPA实体是否存在而不加载它

java - Java Swing 游戏中重置倒计时器不起作用 + JDialog/JOptionPane

java - 如何在java中使用DefaultTableCellRenderer将图像插入到列表中

c# - ToolStripMenuItem 更大的垂直填充,或在更大的 ToolStripMenuItem 中垂直居中文本

css - 显示 :block breaking the float in IE6