【问题标题】:java adding jpanels from other classesjava添加来自其他类的jpanels
【发布时间】:2012-06-18 06:47:04
【问题描述】:

我正在用 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();
    }
}

这就是我从级别 1 中调用它的方式:

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

【问题讨论】:

  • 类名应该以大写字母开头 :) "map1 map1 = new map1()" 有点伤眼。
  • 能否添加更多的实现代码,例如mainScreen 类。根据您的代码,frame 是静态的JFrame 变量?
  • 我认为你在这里过度使用staticframe 可以是mainscreen 的实例变量,方法exitlevelchanger 可以是public 方法。然后在main 方法中,你只需使用new mainscreen()

标签: java swing jframe jpanel


【解决方案1】:

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

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

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

【讨论】:

  • 我尝试使用改进的 levelchanger,但现在我得到一个 java.lang.ExceptionInInitializerError
  • 那么在初始化map1map2 时遇到异常,请检查包装的异常并尝试修复该问题(可能您使用的是未初始化的东西)。
  • 发生了一些奇怪的事情。我在关卡转换器中的 if 语句周围添加了一个 try 块,现在它可以工作了!现在正在从 map1 加载 map2..对此有何解释?
  • 您是否忽略了异常?如果是,打印堆栈跟踪并调试原因。
  • ExceptionInInitializeError 在初始化静态变量时抛出。也许new map1(null)new map2(null) 有问题。还有一件事,为什么要把null 传递给构造函数?
【解决方案2】:

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

【讨论】:

  • 不,我没有增加内存。你能告诉我怎么做吗?
猜你喜欢
  • 1970-01-01
  • 2014-03-30
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多