长话短说,我正在尝试创建一个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);
}
答案 0 :(得分:0)
JPanel需要插入顶级容器,例如JFrame。
您的弹出窗口是JFrame吗? 你能告诉我们将JPanel添加到Jframe的代码吗?