一、前言
这个问题是在做第一个小项目——拼图游戏的时候发现的,在做完整个项目以后会有一个系列来详细描述该项目,也会有另一个专栏来记录我在此过程中遇到的一些问题
二、问题描述
在创建了一个类用于主程序的入口后,运行是不报错的,但是没有显示图形化界面
但是如果在一个测试类中写程序就会弹出窗口(下图二)
三、原因分析
首先看了一下测试类的代码,没有问题,方法设计没问题
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); } }
再看了一下我定义的每个类的代码,发现问题应该是出在方法体内
import javax.swing.*; public class GameJFrame extends JFrame{ public void GameJFrame(){ JFrame gameJFrame = new JFrame(); gameJFrame.setSize(603,680); gameJFrame.setVisible(true); } }
import javax.swing.*; public class LoginJFrame extends JFrame { public void loginJFrame(){ JFrame loginJFrame = new JFrame(); loginJFrame.setSize(488,430); loginJFrame.setVisible(true); } }
import javax.swing.*; public class RegisterJFrame extends JFrame { public void registerJFrame(){ JFrame registerJFrame = new JFrame(); registerJFrame.setSize(488,500); registerJFrame.setVisible(true); } }
- 在定义完GameJFrame、LoginJFrame和RegisterJFrame方法后,如果要调用该方法内的成员变量,要使用this关键字,而不是像在测试类中新建对象后直接调用新的对象,这样的话由于我们调用的方法是不含参数的,如果new了一个对象会被放到堆内存中,数据也在堆内存中,所以无法访问到
- 构造方法不能带有void,因为程序主入口已经定义过了
四、解决方案
1.不要新建对象
2.使用this关键字调用参数
3.定义方法格式改为:
public GameJFrame(){ //方法体 }
public LoginJFrame(){ //方法体 }
public RegisterJFrame(){ //方法体 }
五、正确代码演示
import javax.swing.*; public class GameJFrame extends JFrame { public GameJFrame(){ this.setSize(603,680); this.setVisible(true); } }
import javax.swing.*; public class LoginJFrame extends JFrame { public LoginJFrame(){ this.setSize(488,430); this.setVisible(true); } }
import javax.swing.*; public class RegisterJFrame extends JFrame { public RegisterJFrame(){ this.setSize(488,500); this.setVisible(true); } }
六、涉及知识点
1.构造方法和this关键字
【构造方法和this关键字】
2.内存原理
【内存原理】
七、结语
如果小伙伴碰到其它问题也可以留言评论,对于经典的问题我也会单独出一期博客的