一、前言
本文将讲述了一个在搭建菜单以后运行不成功的问题,会达不到我们想要的效果,并且代码完全没有编译上的问题,对于像我一样的初学者来说会非常的不理解问题出在哪里,那么本文就带领大家搞明白问题出在哪里以及解决方法
二、问题描述
在搭建完菜单以后,程序不报错也能运行,但是运行结果就是一个框,就跟没有搭建过菜单一样,如下图所示,没有我们想象中的菜单栏,更别说有下拉菜单了,但是如果将搭建菜单的代码单独放到一个测试类中去测试一下的话,会显示出来菜单,也就是说我们搭建菜单的核心代码是没有问题的
三、原因分析
1.代码分析
我们先来看一下代码
import javax.swing.*;
public class GameJFrame extends JFrame {
public GameJFrame(){
//设置界面大小
this.setSize(603,680);
//设置标题
this.setTitle("拼图小游戏 V1.0");
//设置永远置顶
this.setAlwaysOnTop(true);
//设置程序随着窗口关闭而结束运行
//this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setDefaultCloseOperation(3);
//设置界面居中
this.setLocationRelativeTo(null);
//设置界面可视化
this.setVisible(true);
//初始化菜单
//创建整个菜单对象(创建JMenuBar)
JMenuBar jMenuBar = new JMenuBar();
//创建"功能"和"关于我们"(创建JMenu)
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//创建菜单下条目(创建JMenuItem)
JMenuItem restartItem = new JMenuItem("重新游戏");
JMenuItem reloginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
//将"功能"下条目添加到"功能"里(将JMenuItem放到JMenu中)
functionJMenu.add(restartItem);
functionJMenu.add(reloginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);//将"关于我们"下条目添加到"关于我们"里
//将JMenu放到JMenuBar中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单,将JMenuBar添加到整个JFrame中
this.setJMenuBar(jMenuBar);
}
}
看似好像是没有问题的,但是由于我们这个拼图小游戏这个是一个可视化的界面,如果看不见的话,那么一定是设置可视化的步骤出现了问题所以我们就要去查看有关于设置可视化的语句,也就是下图红色框的内容
2.执行分析
在这里我们有写一行代码来设置界面可视化,没有问题,但是这里设置可视化的语句在我们搭建菜单的上面,由于执行的顺序是顺序执行的,并且在执行完这个语句以后,这个语句就会从内存中消失,不会再执行第二遍,所以我们只能看到一个框,但是看不到搭建的菜单
3.核心原因(总结)
可视化语句会在搭建菜单前执行,所以当搭建完菜单后不会显示
四、解决方案
- 将可视化语句放到我们搭建的菜单的后面,使得窗口可视化语句放在最后执行,防止部分功能无法被看见
五、正确代码演示
import javax.swing.*;
public class GameJFrame extends JFrame {
public GameJFrame(){
//设置界面大小
this.setSize(603,680);
//设置标题
this.setTitle("拼图小游戏 V1.0");
//设置永远置顶
this.setAlwaysOnTop(true);
//设置程序随着窗口关闭而结束运行
//this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setDefaultCloseOperation(3);
//设置界面居中
this.setLocationRelativeTo(null);
//初始化菜单
//创建整个菜单对象(创建JMenuBar)
JMenuBar jMenuBar = new JMenuBar();
//创建"功能"和"关于我们"(创建JMenu)
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//创建菜单下条目(创建JMenuItem)
JMenuItem restartItem = new JMenuItem("重新游戏");
JMenuItem reloginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
//将"功能"下条目添加到"功能"里(将JMenuItem放到JMenu中)
functionJMenu.add(restartItem);
functionJMenu.add(reloginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);//将"关于我们"下条目添加到"关于我们"里
//将JMenu放到JMenuBar中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单,将JMenuBar添加到整个JFrame中
this.setJMenuBar(jMenuBar);
//设置界面可视化
this.setVisible(true);
}
}
六、涉及知识点
【代码执行顺序】
七、结语
在写可视化界面的时候,一定要把可视化语句 this.setVisible(true);
放在最后,防止某些功能无法被看见