JPanel敌人对象没有加载

时间:2013-07-24 07:03:03

标签: java swing arraylist jpanel paint

长话短说,我正在尝试创建一个java多人游戏。我正在尝试创建一个JPanel战斗动画场景..当服务器向客户端发送攻击消息时,我有战斗机弹出窗口......但没有任何加载,我得到一个我不知道如何解决的nullpointer异常。 / p>

主类 - >有一个handleAttackMessageFromServer(String msg)方法

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

  

FightFrame(msg){FightSceneJPanel(msg)}

我正在尝试加载敌方单位的GIF的JPanel代码:

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

无法弄清楚最新情况!!!

下面是Frame如何加载ScenePanel,但是在main方法的HandleServerAttackMessage()中调用了FightFrame本身。

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

1 个答案:

答案 0 :(得分:0)

JPanel需要插入顶级容器,例如JFrame。

您的弹出窗口是JFrame吗? 你能告诉我们将JPanel添加到Jframe的代码吗?