gpt4 book ai didi

java从其他类添加jpanels

转载 作者:行者123 更新时间:2023-11-29 05:58:35 24 4
gpt4 key购买 nike

我正在用 Java 开发一个游戏,我正在尝试从不同的类文件加载不同的级别。每个级别的类文件是一个 jpanel.这个想法是,当 level1 完成时,它会加载一个删除 jpanel level1 并添加 jpanel level2 的方法。但是当我试图从 level1 加载 level2 时,我得到一个 java.lang.OutOfMemoryError: unable to create new native thread。错误

我有 3 个类文件:

  • main:加载jframe和添加jpanels的方法
  • level1:加载level1,然后通过main中的方法加载level2
  • level2:加载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();
}
}
}

最佳答案

首先,OutOfMemoryError 与这段代码没有任何关系,可能 map1map2 正在分配大量内存,也许这个答案将帮助您重新释放一些内存。

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

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

  3. (您可以让 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();
}
}

更好的方法是创建一个接口(interface) Map 并让 map1map2 实现 Map,同时创建 map 自己的面板 (mapPanel)。像这样:

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

关于java从其他类添加jpanels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11078053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com