我正在开发一个java游戏,我试图从不同的类文件加载不同的级别。每个级别类文件都是一个jpanel。想法是当level1完成时,它会加载一个删除jpanel level1并添加jpanel level2的方法。但是当我尝试从level1加载level2时,我得到一个java.lang.OutOfMemoryError:无法创建新的本机线程。错误
我有3个类文件:
这是主类中的方法:
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();
}
}
}
答案 0 :(得分:3)
首先,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();
}
}
更好的方法是创建一个界面Map
,让map1
和map2
实现Map
,同时创建一个自己的面板(mapPanel
)地图。像这样:
public static void levelChanger(Map map){
mapPanel.removeAll();
mapPanel.add(map);
}
答案 1 :(得分:0)
我无法确定您提供的代码但是您的错误是OutOfMemoryError,您是否增加了默认的Java内存?尝试-Xms512m -Xmx1024m
命令行选项(或放入你想要的任何内存大小)。