进行JFrame的跳转时,JFrame中的继承于JPanel的内容显示不出来,且无法关闭

在做一个Java小游戏的时候遇到的问题,困扰了几天
知道自己的代码存在很严重的代码复制现象,但是现在还是先解决目前的问题吧
做的是一个叫“小刻找蜜饼”的小游戏

Ceobe.java

import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.*;
import java.io.*;

import javax.imageio.*;

public class Ceobe {

    BufferedImage ceobeImg;
    int x;
    int y;
    int width;
    int height;
    int size;
    
    double g;
    double t;
    double v0;
    double v;
    double s;
    double angle;
    
    public Ceobe() throws Exception{
        
        cutCircleImage();    
        
        ceobeImg = ImageIO.read(new File("res/ceobe1.png"));
        
        x = 180;
        y = 250;
        width = ceobeImg.getWidth();
        height = ceobeImg.getHeight();
        size = 40;
        
        g = 4;
        t = 0.25;
        v0 = 20;
        v = v0;
        s = 0;
        angle = 0;
        
    }
    
    public void moivng() {
        
        double v0 = v;
        s = v0 * t + g * t * t / 2;
        y = y - (int) s;
        double next_v = v0 - g * t;
        v = next_v;
        angle = Math.atan(s / 8);
        
    }
    
    public void recovering_v0() {
        
        v = v0;
        
    }
    
    public boolean pick_cake(Cake c, char ch) {
        
        if((y > c.y - c.size / 2 - size / 2)
                && (y < c.y)) {
            if((x > c.x - size / 2 - c.size / 2)
                    && (x < c.x + size / 2 + c.size / 2)) {
                if(ch == c.character1) {
                    c.img = c.deleteImg;
                    c.character1 = c.deletecharacter;
                    c.x = c.deletex;
                    c.y = c.deletey;
                    Game.score += 100 / Char.poetry.length();
                    return true;
                }else {
                    Game.state = Game.GAME_OVER;
                }
            }
            return false;
        }
        return false;
        
    }
    
    public boolean exsitFrame() {
        
        if(y > 600 - height / 2 + 10) {
            return true;
        }
        if(y < -height / 2 - 10) {
            return true;
        }
        return false;
        
    }
    
    public void cutCircleImage() {
        
        try {
            BufferedImage b_img1 = ImageIO.read(new File("res/ceobe.png"));
            BufferedImage b_img2 = new BufferedImage(b_img1.getWidth(),
                    b_img1.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
            
            Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, 
                    b_img1.getWidth(), b_img1.getHeight());
            
            Graphics2D g2 = b_img2.createGraphics();
            g2.setClip(shape);
            g2.setBackground(null);
            g2.draw(new Rectangle(b_img2.getWidth(), b_img2.getHeight()));
            g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
                    (RenderingHints.VALUE_TEXT_ANTIALIAS_GASP));
            g2.drawImage(b_img1, 0, 0, null);
            g2.dispose();    
            ImageIO.write(b_img2, "png", new File("res/ceobe1.png"));
        } catch(IOException e) {
            e.printStackTrace();
        }
        
    }
    
}

Cale.java

import java.awt.image.*;
import java.io.*;

import javax.imageio.*;

public class Cake {

    BufferedImage cakeImg;
    BufferedImage deleteImg;
    BufferedImage img;    
    int x;
    int deletex;
    int y;
    int deletey;
    int width;
    int height;
    int size;
    
    int distance;
    int gap;
    
    char character;
    char deletecharacter;
    char character1;
    
    public Cake(int i, int j, char c) throws Exception{
        
        character = c;
        deletecharacter = ' ';
        character1 = character;
        
        cakeImg = ImageIO.read(new File("res/cake.png"));
        deleteImg = ImageIO.read(new File("res/delete.png"));
        img = cakeImg;
        
        size = 40;
        distance = 280;
        gap = 40;
        
        width = cakeImg.getWidth();
        height = cakeImg.getHeight();
        x = 680 + (i - 1) * distance;
        deletex = 0;
        y = 25 + 33 + cakeImg.getHeight() / 2 + j * (gap + height);
        deletey = 0;
        
    }
    
    public void moving() {
        
        x--;
        
    }
    
}

Char.java

import java.util.ArrayList;
import java.util.Random;

public class Char {
    
    int x;
    int y;
    
    int distance;
    int gap;
    
    static String poetry;
    char [] character;
    char [] newcharacter;
    Random r = new Random();
    int n;
    
    public Char(int num) {
        
        //初始化信息
        poetry = "春眠不觉晓处处闻啼鸟夜来风雨声花落知多少";
        character = new char[5];

        character[4] = poetry.charAt(num);
        n = 0;
        ArrayList<Character> ch = new ArrayList<>();
        while(ch.size() < 4) {
            int xx = r.nextInt(poetry.length());
            if(poetry.charAt(xx) != character[4]) {
                if (!ch.contains(poetry.charAt(xx))) {
                    ch.add(poetry.charAt(xx));
                    character[n] = poetry.charAt(xx);
                    n++;
                }
            }
        }
        
        newcharacter = randomChar(character);
        
    }
    
    public static char[] randomChar(char [] c) {

        int length = c.length;
        ArrayList<Integer> randomList = new ArrayList<>();
        
        while (randomList.size() < length) {
            int x = new Random().nextInt(length);
            if (!randomList.contains(x)) {
                randomList.add(x);
            }
        }
        
        char[] randomArray = new char[length];
        for (int i = 0; i < randomArray.length; i++) {
            randomArray[i] = c[randomList.get(i)];
        }
        return randomArray;
        
    }
    
}


Game.java
Game类确实太长了,我有罪
在文本文件里
链接:https://pan.baidu.com/s/1KyD04_E_kiQwf5RrpiCiwg?pwd=wqaq
提取码:wqaq
里面顺便还有要用的图片

GameFrame.java

import java.awt.*;

import javax.swing.*;

public class GameFrame extends JFrame{
    
    public GameFrame() throws Exception {
        JFrame frame = new JFrame("小刻找蜜饼");
        Game game = new Game();
        
        frame.add(game);
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        
        game.start();
        
    }
    
//    public static void main(String[] args) throws Exception {
//        GameFrame g = new GameFrame();
//    }
    
}

以上就是游戏的总代码,把GameFrame里main的注释去掉,附上图片运行还是能跑的
图片在这:https://pan.baidu.com/s/1IHhbBxMzkxCeIviv8awuKg?pwd=wqaq
提取码:wqaq

然后长这样

img

至于开始跳转的界面就随便写一个先吧

import java.awt.event.ActionEvent;

import javax.swing.*;

public class test extends JFrame{
    
    JFrame frame;
    JButton b;
    
    test(){
        frame = new JFrame("test");
        b = new JButton("跳转");
        
        setLayout(null);
        b.setSize(60, 60);
        b.addActionListener(e -> {
            try {
                btn_ActionPerformed(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        });
        
        frame.getContentPane().add(b);
        frame.setSize(200, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        
    }
    
    public void btn_ActionPerformed(ActionEvent event) throws Exception {
        frame.setVisible(false);
        GameFrame gf = new GameFrame();
    }
    
    public static void main(String[] args) {
        test t =new test();
    }
    
}


点击跳转按钮就直接白了,点右上角的退出也退出不了,就很懵

img

不应该只是JFrame之间的跳转吗,JPanel的功能在JFrame中也没变化啊,就很不理解

就想问一下我是哪里错了导致继承于JPanel的Game加载不出来

然后怕有些佬找不到上面的链接再放一次
图片在这:https://pan.baidu.com/s/1IHhbBxMzkxCeIviv8awuKg?pwd=wqaq
提取码:wqaq
感谢佬们

如果窗体没响应了,那多半是陷入阻塞了
仔细检查代码里有无死循环、IO阻塞之类的代码

原因
JFrame中调用了JFrame
但是,你不能把一个 JFrame 放在另一个里面。


解决办法
您在这里有几个设计选择。
1、您可以将 JFrames 更改为 JPanels,这可能是最简单的改变。

2、另一方面,您可以考虑使用内部框架JInternalFrame。
比如:https://docs.oracle.com/javase/tutorial/uiswing/components/internalframe.html

在您的情况下,我建议您使用可以在Jframe中添加的****JInternalFrame尝试此代码:

package demo;

import javax.swing.JFrame;
import javax.swing.JInternalFrame;

public class Demo {
    public static void main(String[] args) {

        JFrame jf=new JFrame();
        jf.setLayout(null);
        jf.setSize(1280, 720);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JInternalFrame jInternalFrame=new JInternalFrame();
        jInternalFrame.setLocation(100, 100);
        jInternalFrame.setSize(500, 300);
        jInternalFrame.setTitle("Internal frame");
        jInternalFrame.setVisible(true);
        jInternalFrame.setClosable(true);
        jInternalFrame.setResizable(true);
        jf.add(jInternalFrame);
        jf.repaint();
    }
}

参考链接:

试试点击按钮Open一个JFrame显示游戏,而不是隐藏原Jframe