Java JPanel敌方物体未加载

Java JPanel敌方物体未加载,java,swing,arraylist,jpanel,paint,Java,Swing,Arraylist,Jpanel,Paint,长话短说,我正在尝试创建一个java多人游戏。我正在尝试创建一个JPanel战斗动画场景。。当服务器向客户端发送攻击消息时,我会弹出“战斗屏幕”。。。但是什么都没有加载,我得到了一个null指针异常,我不知道如何解决它 Main Class->有一个handleAttackMessageFromServer(String msg)方法 这个方法加载一个新的Jframe,它有一个扩展JPanel的对象 FightFrame(msg){FightSceneJPanel(msg)} 我的JPanel代

长话短说,我正在尝试创建一个java多人游戏。我正在尝试创建一个JPanel战斗动画场景。。当服务器向客户端发送攻击消息时,我会弹出“战斗屏幕”。。。但是什么都没有加载,我得到了一个null指针异常,我不知道如何解决它

Main Class->有一个handleAttackMessageFromServer(String msg)方法

这个方法加载一个新的Jframe,它有一个扩展JPanel的对象

FightFrame(msg){FightSceneJPanel(msg)}

我的JPanel代码,我试图加载敌人单位的GIF:

public class FightScene extends JPanel{
private ArrayList<Enemy> offense;
private ArrayList<Defense> defense;
private EnemyFactory enemyFactory;
private DefenseFactory defenseFactory;
private boolean ingame;
int NumberOfEnemyTypeA, ..., NumberOfEnemyTypeN;

public FightScene(){

offense = new ArrayList<Enemy>();
defense = new ArrayList<Defense>();

setFocusable(true);
setBackground(Color.RED);
setDoubleBuffered(true);
setSize(652, 480);
    setVisible(true);

enemyFactory = new EnemyFactory();
defenseFactory= new DefenseFactory();
}

public void FightScene(String attackmsg){
ingame=true;

// string parsing to figure out how many of what units were sent over
NumberOfEnemyTypeA = Integer.parseint(msg.(....)));
// ...
NumberOFEnemyTypeN = Integer.parseint(msg.(...)));
if(NumberOfEnemyTypeA!=0){
        for (int i =1;i<NumberOfEnemyTypeA+1;i++){
            theEnemy=enemyFactory.makeEnemy(1, 0-i*40);
             offense.add(theEnemy);
        }}

System.out.println("Offense size: "+offense.size()); // <<< When i do this, it says offense //size is 0!!.. even when NumberOFEnemyTypeA is 5, 10 or any number>0
}

// and when i try to draw... I get nothing, because ofcourse offense == 0
public void paint(Graphics g) {
        super.paint(g);
            Graphics2D g2d = (Graphics2D)g;
        for (int i = 0; i < offense.size(); i++) {
                if(offense.get(i) instanceof EnemyTypeA){
                    EnemyTypeA a = (EnemyTypeA)offense.get(i);
                    if(a.isVisible()){ 
                        g2d.drawImage(a.getImage(), a.getX(), a.getY(), this);
                        }
                }
// ....
                if(offense.get(i) instanceof EnemyTypeN){
                    EnemyTypeN a = (EnemyTypeN)offense.get(i);
                    if(a.isVisible()){ 
                        g2d.drawImage(a.getImage(), a.getX(), a.getY(), this);
                        }
                }
}
}

JPanel需要插入到顶级容器中,如JFrame

你的弹出窗口是JFrame吗?
您可以向我们展示将JPanel添加到Jframe的代码吗?

您可以添加stacktrace和导致抛出
NullPointerException
的代码行吗?@MadProgrammer这不是构造函数。。。OP应该移除其中的空白。或我不确定。他绝对不应该把方法命名为构造函数。@Kayaman啊,我的错,谢谢你不要重写swing组件的
paint()
。重写
paintComponent()
,并在需要绘制更改时调用
repaint()
。1)对代码块使用一致的逻辑缩进。代码的缩进旨在帮助人们理解程序流程。2) 为了更快地获得更好的帮助,请发布一个。3) 你已经描述了一个问题以及你怎么做不到,但到目前为止还没有提出一个问题(更不用说一个具体的、可回答的问题了)。你的问题是什么?4) 源代码中只有一行空白就足够了。第二个参数中的表达式正确吗?我不知道你的“制造敌人”是怎么运作的,但它看起来很奇怪。。。。敌人=敌人工厂。制造敌人(1,0-i*40);这是我自己定制的Enemy工厂,我自己制作的,而且很有效。。这不是enemyFactory的问题。make敌军(键入,启动x-location-on-panel)这可能很简单,但您是否检查过它是否正确解析NumberOfEnemyTypeA?例如,在创建敌人的for循环中添加i的打印?我刚刚看到了您添加的新代码:Canyouaddsc.Scene(offensemg);在您使面板可见后的说明末尾?是的,检查了解析,工作正常<代码>系统输出打印LN(NumberOfEneyTypeA);//如果(NumberOfEnemyTypeA!=0){for(int i=1;i),则给出100(从服务器传递100时)

public void FightFrame(String offensemsg){
            JFrame frame = new JFrame("BattleView: ");
            frame.setLayout(new BorderLayout());
            FightScene sc = new FightScene();
            sc.Scene(offensemsg);

            frame.add(sc);
            frame.setVisible(true);
            frame.setSize(652, 480);
            frame.setLocationRelativeTo(null);
            frame.setResizable(false);
        }