【Java】菜单制作

一、介绍

本节内容就是在游戏窗口的上方,去添加菜单。

image-20240419205521674

要创建菜单,那就要先去创建菜单的对象。在Java中有一个类,它是用来专门描述菜单的:JMenuBar(Java Menu Bar)

但是光有 JMenuBar 这一个类还不行,因为 JMenuBar 表示的是这一整个菜单,即我现在红色框起来的这一部分。

image-20240419205752990

在菜单中,它还会有很多的选项,每一个选项都对应着一个 JMenu 的类,例如:功能、联系我们、充值入口。。。

现在在菜单中有三个选项,因此在代码中,我就需要创建三个 JMenu 的对象。

image-20240419205943262

现在我以第一个 功能 选项为例,当我点击功能选项,下面它还会有多个下拉框,这里它会有很多个选择,每个选择都是独立的 JMenueItem 的对象,这里的 Item 就可以把它理解成 条目 的意思。因此我们也可以把下拉框中的每一个选择称之为每一个条目

此时这个菜单的接口,就有一点点的难度了。

image-20240419210226917

二、制作步骤

1、先创建 JMenuBar 的对象

2、再创建 JMnue 的对象

3、再创建 JMenuItem 的对象

image-20240419210429249

但是这三个对象创建出来后,它们之间是互相独立的。

4、因此,我们还需要将 JMenuItem 放到 JMenu 里面

5、再把 JMenue 放到 JMenuBar

6、最后把整个菜单 JMenuBar 添加到 JFrame 界面中


三、代码实现

先来看一下最终效果,其中 更换图片 的代码比较复杂,我们写不写,等后面写到业务逻辑的时候,再去补全。

image-20240419210949312

然后找到 GameJFrame类,当我们创建这个类对象的时候,会调用它的空参构造,首先一开始,它会对整个界面来做一个设置,设置完成后,再去让它设置菜单,因此我们应该将设置菜单的代码写在如下图箭头位置。

image-20240419211243386

等菜单初始化完毕后,再去调用 setVisible() 把整个界面展示出来,因此展示界面的代码,我们一定要放到最后面。

GameJFrame.java

下面代码只需要从 初始化菜单(第23行) 开始看即可,其他的都是之前写过的

package com.itheima.ui;

import javax.swing.*;

public class GameJFrame extends JFrame {
    //规定:GameJFrame这个界面表示的就是游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中
    public GameJFrame() {
        // 设置界面的宽高
        this.setSize(603, 680);
        // 设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        // 设置界面置顶,setAlwaysOnTop:一直处在最上方
        // ctrl + p:可以看见需要传入一个boolean类型的参数,传入true之后,它会盖住所有的软件
        this.setAlwaysOnTop(true);
        // 设置界面居中
        this.setLocationRelativeTo(null);
        // 设置关闭模式,setDefaultCloseOperation:设置默认的关闭方式
        // 括号中写的数字3
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


        // 初始化菜单
        // 1.创建整个菜单对象 JMenuBar
        JMenuBar jMenuBar = new JMenuBar();

        // 2.创建菜单上面两个选项的对象(功能、关于我们) JMenu
        JMenu functionJMenu = new JMenu("功能"); // 将要展示的文字放在小括号中,表示调用它的有参构造。
        // 快捷键 ctrl + d :向下复制一行
        JMenu aboutJMenu = new JMenu("关于我们");

        // 3.创建选项下面的条目对象(功能:重新游戏、重新登陆、关闭游戏;关于我们:公众号),合起来一共四个 JMenuItem 对象
        JMenuItem replayItem = new JMenuItem("重新游戏"); // 同样也是调用它的有参构造设置展示文字
        // 快捷键 ctrl + d :向下复制一行
        JMenuItem reLoginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");

        // 由于前三个是一组,最后一个公众号是一组,因此我们在写代码的时候打一个空行,提高阅读性
        JMenuItem accountItem = new JMenuItem("公众号");

        // 4.将每一个选项下面的条目添加到选项中:调用JMenu对象的add方法
        functionJMenu.add(replayItem);
        // 快捷键 ctrl + d :向下复制一行
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);

        aboutJMenu.add(accountItem);

        // 5.将菜单里面的两个选项添加到菜单当中:调用JMenuBar对象的add方法
        jMenuBar.add(functionJMenu);
        // 快捷键 ctrl + d :向下复制一行
        jMenuBar.add(aboutJMenu);

        // 6.把整个菜单 `JMenuBar` 添加到 `JFrame` 界面中
        // this 表示当前的界面对象,调用 setJMenuBar 方法
        this.setJMenuBar(jMenuBar);


        // 让界面显示出来,这行代码我们建议写在最后
        this.setVisible(true);
    }
}

代码写完后,回到 App.java 中,先将 LoginJFrameRegisterJFrame 注释掉,只留 GameJFrame,然后直接右键Run。

image-20240419214002959

程序运行完毕后发现,这里的菜单已经有了,并且点击对应的选项也会出现其包含的条目。

image-20240419214122199

四、优化

1)优化讲解

当我们写完 GameJFrame类 中的代码后,可以发现构造方法中的代码太多了!

那以后代码出问题了,还需要在构造方法中一行一行的找,太麻烦了!

因此我们需要将构造方法中不同功能的代码进行抽取,抽取成一个独立的方法。

例如将 界面设置初始化菜单 分别放到一个方法中即可。

选中上面的这一堆

image-20240419214430338

按快捷键 ctrl + alt + M ,然后改下方法名:initJFrame(初始化界面),然后回车即可。

image-20240419214548577

最后在构造方法中给 initJFrame() 方法加上注释即可。

image-20240419214732701

接下来抽取跟菜单相关的代码。

选中跟菜单相关的代码

image-20240419215013198

按快捷键 ctrl + alt + M ,然后改下方法名:initJMenuBar(初始化菜单),然后回车即可。

image-20240419215134207

最后在构造方法中给 initJMenuBar() 方法加上注释即可。


然后下面的这两个方法我们直接放到最后就行了,以后如果要修改,直接找对应的方法就OK了,非常的方便。

image-20240419215311282

现在我们再来回过头来看构造,构造方法中的代码就非常简洁了。

image-20240419215355088

最后再来右键运行,看下效果,可以看见程序没有任何问题。

image-20240419215449257


2)完整代码

GameJFrame.java

package com.itheima.ui;

import javax.swing.*;

public class GameJFrame extends JFrame {
    //规定:GameJFrame这个界面表示的就是游戏的主界面
    //以后跟游戏相关的所有逻辑都写在这个类中
    public GameJFrame() {
        // 初始化界面
        initJFrame();

        // 初始化菜单
        initJMenuBar();

        // 让界面显示出来,这行代码我们建议写在最后
        this.setVisible(true);
    }

    private void initJMenuBar() {
        // 1.创建整个菜单对象 JMenuBar
        JMenuBar jMenuBar = new JMenuBar();

        // 2.创建菜单上面两个选项的对象(功能、关于我们) JMenu
        JMenu functionJMenu = new JMenu("功能"); // 将要展示的文字放在小括号中,表示调用它的有参构造。
        // 快捷键 ctrl + d :向下复制一行
        JMenu aboutJMenu = new JMenu("关于我们");

        // 3.创建选项下面的条目对象(功能:重新游戏、重新登陆、关闭游戏;关于我们:公众号),合起来一共四个 JMenuItem 对象
        JMenuItem replayItem = new JMenuItem("重新游戏"); // 同样也是调用它的有参构造设置展示文字
        // 快捷键 ctrl + d :向下复制一行
        JMenuItem reLoginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");

        // 由于前三个是一组,最后一个公众号是一组,因此我们在写代码的时候打一个空行,提高阅读性
        JMenuItem accountItem = new JMenuItem("公众号");

        // 4.将每一个选项下面的条目添加到选项中:调用JMenu对象的add方法
        functionJMenu.add(replayItem);
        // 快捷键 ctrl + d :向下复制一行
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);

        aboutJMenu.add(accountItem);

        // 5.将菜单里面的两个选项添加到菜单当中:调用JMenuBar对象的add方法
        jMenuBar.add(functionJMenu);
        // 快捷键 ctrl + d :向下复制一行
        jMenuBar.add(aboutJMenu);

        // 6.把整个菜单 `JMenuBar` 添加到 `JFrame` 界面中
        // this 表示当前的界面对象,调用 setJMenuBar 方法
        this.setJMenuBar(jMenuBar);
    }

    private void initJFrame() {
        // 设置界面的宽高
        this.setSize(603, 680);
        // 设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        // 设置界面置顶,setAlwaysOnTop:一直处在最上方
        // ctrl + p:可以看见需要传入一个boolean类型的参数,传入true之后,它会盖住所有的软件
        this.setAlwaysOnTop(true);
        // 设置界面居中
        this.setLocationRelativeTo(null);
        // 设置关闭模式,setDefaultCloseOperation:设置默认的关闭方式
        // 括号中写的数字3
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值