• 运行主程序后无法显示图形化界面的原因及其解决方法(拼图小游戏)



    一、前言

    这个问题是在做第一个小项目——拼图游戏的时候发现的,在做完整个项目以后会有一个系列来详细描述该项目,也会有另一个专栏来记录我在此过程中遇到的一些问题

    二、问题描述

    在创建了一个类用于主程序的入口后,运行是不报错的,但是没有显示图形化界面
    但是如果在一个测试类中写程序就会弹出窗口(下图二)
    在这里插入图片描述

    在这里插入图片描述

    三、原因分析

    首先看了一下测试类的代码,没有问题,方法设计没问题

    import javax.swing.*;
    
    public class Test {
        public static void main(String[] args) {
    
            //创建游戏主界面
            JFrame gameJFrame = new JFrame();
            //设置长宽
            gameJFrame.setSize(603,680);
            //设置可视化
            gameJFrame.setVisible(true);
    
            //创建登录界面
            JFrame loginJFrame = new JFrame();
            loginJFrame.setSize(488,430);
            loginJFrame.setVisible(true);
    
            //创建注册界面
            JFrame registerJFrame = new JFrame();
            registerJFrame.setSize(488,500);
            registerJFrame.setVisible(true);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    再看了一下我定义的每个类的代码,发现问题应该是出在方法体内

    import javax.swing.*;
    
    public class GameJFrame extends JFrame{
        public void GameJFrame(){
            JFrame gameJFrame = new JFrame();
            gameJFrame.setSize(603,680);
            gameJFrame.setVisible(true);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    import javax.swing.*;
    
    public class LoginJFrame extends JFrame {
        public void loginJFrame(){
            JFrame loginJFrame = new JFrame();
            loginJFrame.setSize(488,430);
            loginJFrame.setVisible(true);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    import javax.swing.*;
    
    public class RegisterJFrame extends JFrame {
        public void registerJFrame(){
            JFrame registerJFrame = new JFrame();
            registerJFrame.setSize(488,500);
            registerJFrame.setVisible(true);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 在定义完GameJFrameLoginJFrameRegisterJFrame方法后,如果要调用该方法内的成员变量,要使用this关键字,而不是像在测试类中新建对象后直接调用新的对象,这样的话由于我们调用的方法是不含参数的,如果new了一个对象会被放到堆内存中,数据也在堆内存中,所以无法访问到
    • 构造方法不能带有void,因为程序主入口已经定义过了

    四、解决方案

    1. 不要新建对象
    2. 使用this关键字调用参数
    3. 定义方法格式改为:
    public GameJFrame(){
    	//方法体
    }
    
    • 1
    • 2
    • 3
    public LoginJFrame(){
    	//方法体
    }
    
    • 1
    • 2
    • 3
    public RegisterJFrame(){
    	//方法体
    }
    
    • 1
    • 2
    • 3

    五、正确代码演示

    import javax.swing.*;
    
    public class GameJFrame extends JFrame {
    
        public  GameJFrame(){
            this.setSize(603,680);
            this.setVisible(true);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    import javax.swing.*;
    
    public class LoginJFrame extends JFrame {
    
        public LoginJFrame(){
    
            this.setSize(488,430);
            this.setVisible(true);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    import javax.swing.*;
    
    public class RegisterJFrame extends JFrame {
        public  RegisterJFrame(){
    
            this.setSize(488,500);
            this.setVisible(true);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    六、涉及知识点

    1.构造方法和this关键字

    构造方法和this关键字

    2.内存原理

    内存原理


    七、结语

    如果小伙伴碰到其它问题也可以留言评论,对于经典的问题我也会单独出一期博客的

  • 相关阅读:
    5.11 Firmware Commit command
    javascript禁止鼠标右键和复制功能
    usb hub芯片GL850G创惟
    信息学奥赛一本通:1175:除以13
    laravel+elementui el-upload上传文件
    倍福TwinCAT3实现CSV、TXT文件读写操作
    手动模式配置链路聚合
    ARM-Linux内核基础知识
    群接龙大团长有哪些,群接龙大团长如何对接?
    conda创建pytorch环境报错
  • 原文地址:https://blog.csdn.net/Alita233_/article/details/126773928