java从其他类添加jpanels

时间:2012-06-18 06:47:05

标签: java swing jframe jpanel

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

我有3个类文件:

  • main:加载jframe和添加jpanels的方法
  • level1:加载level1,然后通过main
  • 中的方法加载level2
  • level2:load level2

这是主类中的方法:

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();
    }
}

这就是我从level1调用它的方式:

mainScreen.levelChanger(2);

希望我提供了足够的信息。谢谢!


这是整个主要课程:

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();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

首先,OutOfMemoryError对此代码没有任何影响,可能map1map2正在分配大量内存,也许这个答案可以帮助你重新启动一些内存

  1. 每次调用levelChanger时,您都会分配一个新的map1map2对象。即使您只使用一个这些对象

  2. 更改为第2级时,您不会删除相同的map1对象。

  3. (您可以让levelChanger取代map参数)


  4. 改进的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();
        }
    }
    

    更好的方法是创建一个界面Map,让map1map2实现Map,同时创建一个自己的面板(mapPanel)地图。像这样:

    public static void levelChanger(Map map){
        mapPanel.removeAll();
        mapPanel.add(map);
    }
    

答案 1 :(得分:0)

我无法确定您提供的代码但是您的错误是OutOfMemoryError,您是否增加了默认的Java内存?尝试-Xms512m -Xmx1024m命令行选项(或放入你想要的任何内存大小)。