java从其他类添加JPanel

java从其他类添加JPanel,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我正在用java开发一个游戏,我正在尝试从不同的类文件加载不同的级别。每个级别类文件都是一个jpanel。其思想是,当完成level1时,它将加载一个方法,该方法删除jpanellevel1并添加jpanellevel2。但是当我试图从level1加载level2时,我得到一个java.lang.OutOfMemoryError:无法创建新的本机线程。错误 我有3个类文件: main:加载jframe和添加jpanels的方法 level1:通过main中的方法加载level1,然后加载lev

我正在用java开发一个游戏,我正在尝试从不同的类文件加载不同的级别。每个级别类文件都是一个jpanel。其思想是,当完成level1时,它将加载一个方法,该方法删除jpanellevel1并添加jpanellevel2。但是当我试图从level1加载level2时,我得到一个java.lang.OutOfMemoryError:无法创建新的本机线程。错误

我有3个类文件:

  • main:加载jframe和添加jpanels的方法
  • level1:通过main中的方法加载level1,然后加载level2
  • 级别2:负载级别2
这是主类中的方法:

public static void levelChanger(int currentMap){
    map1 map1 = new map1(null);
    map2 map2 = new map2(null);

    if(currentMap == 1){
        frame.add(map1);
        frame.validate();
    }else if(currentMap == 2){
        frame.remove(map1);
        frame.add(map2);
        frame.validate();
    }
}
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

public class mainScreen{

    static JFrame frame = new JFrame("Tile System");

    //Key variables
    public static int keyUp = KeyEvent.VK_UP;
    public static int keyDown = KeyEvent.VK_DOWN;

    public static void main(String[] args) {
        levelChanger(1);
        frame.setSize ( 800, 600 );
        frame.setResizable ( false );
        frame.setLocationRelativeTo ( null );
        frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
        frame.setVisible ( true );
        frame.setBackground(new Color(135, 206, 250));//RGB color code
        frame.setFocusable(true);

        new map1(null);
    }
    public static void exit(){
        WindowEvent wev = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
    }

    public static void levelChanger(int currentMap){
        public static map1 map1 = new map1(null);
            public static map2 map2 = new map2(null);
        if(currentMap == 1){
            frame.add(map1);
            frame.validate();
        }else if(currentMap == 2){
            frame.remove(map1);
            frame.add(map2);
            frame.validate();
        }
    }
}
这就是我在第1级中对它的称呼:

mainScreen.levelChanger(2);
希望我提供了足够的信息。谢谢


这是整个主类:

public static void levelChanger(int currentMap){
    map1 map1 = new map1(null);
    map2 map2 = new map2(null);

    if(currentMap == 1){
        frame.add(map1);
        frame.validate();
    }else if(currentMap == 2){
        frame.remove(map1);
        frame.add(map2);
        frame.validate();
    }
}
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

public class mainScreen{

    static JFrame frame = new JFrame("Tile System");

    //Key variables
    public static int keyUp = KeyEvent.VK_UP;
    public static int keyDown = KeyEvent.VK_DOWN;

    public static void main(String[] args) {
        levelChanger(1);
        frame.setSize ( 800, 600 );
        frame.setResizable ( false );
        frame.setLocationRelativeTo ( null );
        frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
        frame.setVisible ( true );
        frame.setBackground(new Color(135, 206, 250));//RGB color code
        frame.setFocusable(true);

        new map1(null);
    }
    public static void exit(){
        WindowEvent wev = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
    }

    public static void levelChanger(int currentMap){
        public static map1 map1 = new map1(null);
            public static map2 map2 = new map2(null);
        if(currentMap == 1){
            frame.add(map1);
            frame.validate();
        }else if(currentMap == 2){
            frame.remove(map1);
            frame.add(map2);
            frame.validate();
        }
    }
}

首先,
OutOfMemoryError
实际上与此代码没有任何关系,可能
map1
map2
分配了大量内存,也许此答案将帮助您释放一些内存

  • 每次调用
    levelChanger
    时,您都在分配一个新的
    map1
    map2
    对象。即使您将只使用其中一个对象

  • 更改为级别2时,您没有删除相同的
    map1
    对象

  • (您可以让
    levelChanger
    取而代之的是
    map
    参数)


  • 改进的
    levelChanger
    方法如下所示:

    // allocate maps once
    static map1 map1 = new map1(null);
    static map2 map2 = new map2(null);
    
    public static void levelChanger(int currentMap){
    
        if (currentMap == 1){
            frame.add(map1);
            frame.validate();
        } else if (currentMap == 2) {
            frame.remove(map1);
            frame.add(map2);
            frame.validate();
        }
    }
    
    public static void levelChanger(Map map){
        mapPanel.removeAll();
        mapPanel.add(map);
    }
    

    更好的方法是创建一个接口
    Map
    ,让
    map1
    map2
    实现
    Map
    ,同时为Map创建一个自己的面板(
    mapPanel
    )。大概是这样的:

    // allocate maps once
    static map1 map1 = new map1(null);
    static map2 map2 = new map2(null);
    
    public static void levelChanger(int currentMap){
    
        if (currentMap == 1){
            frame.add(map1);
            frame.validate();
        } else if (currentMap == 2) {
            frame.remove(map1);
            frame.add(map2);
            frame.validate();
        }
    }
    
    public static void levelChanger(Map map){
        mapPanel.removeAll();
        mapPanel.add(map);
    }
    

    我不能确定您提供的代码是否正确,但您的错误是OutOfMemoryError,您是否增加了默认java内存?请尝试
    -Xms512m-Xmx1024m
    命令行选项(或放入任意内存大小)。

    类名应以大写字母开头:)“map1 map1=new map1()”有点伤我的眼睛。您可以添加更多实现代码,如
    mainScreen
    类吗。根据您的代码,
    frame
    是一个静态
    JFrame
    变量?我认为您在这里过度使用了
    static
    frame
    可以是
    main-screen
    的实例变量,方法
    exit
    levelchanger
    可以是
    public
    方法。然后在
    main
    方法中,您只需使用
    newmainscreen()
    。不,我没有增加内存。你能告诉我怎么做吗?我试过使用改进的levelchanger,但现在我得到了一个java.lang.ExceptionInInitializerError。然后,当初始化
    map1
    map2
    时,你会得到一个异常,请检查包装的异常并尝试修复该问题(可能你正在使用未初始化的某个东西).奇怪的事情发生了。我在level changer中的if语句周围添加了一个try块,现在它可以工作了!现在正在从map1加载map2。。对此有何解释?你是否忽略了例外情况?如果是,请打印堆栈跟踪并调试原因。初始化静态变量时会抛出
    异常InInitializeError
    。也许
    newmap1(null)
    newmap2(null)
    有一些问题。还有一件事,为什么要将
    null
    传递给构造函数?