我的打算是设计一个射击型的小游戏。内容是战舰产生子弹攻击飞机,飞机和战舰都可动。
主页面MyFrame布置主页面。
其中Fighter产生飞机,但是飞机我想设计成随机产生的,产生的飞机想加载到主页面中显示。
所以我想在线程类Fighter中调用主页面中显示主菜单的JPanel(xianshi),使用xianshi.add(Fighter)方法来往主页面进行添加。
其中以下语句报错为空指针。为什么?
MyFrame中:
public class MyFrame {
        public JPanel xianshi;
        public JPanle getXianshi(){
              xianshi=this.xianshi;
              return xianshi;
        }
Fighter中定义了MyFrame的对象myFrame,
this.myFrame.getXianshi().add(fighter);//调用getXianshi()的方法传入xianshi,
这句报错空指针,是什么原因?我很模糊的好像知道一点,但是不清楚,谁能帮忙说清楚一下到底为什么错了。
另外我这个思路应该怎么实现?

解决方案 »

  1.   

    public JPanel xianshi;啥时候初始化过这个对象的?
      

  2.   

    在Frame主函数的init函数中进行的初始化。
    private void init() {
    contentPane.setLayout(null);
    //对上侧的显示页面进行设置
    xianshi=new JPanel();
    xianshi.setBounds(0, 0, 800, 600);
    xianshi.setLayout(null);
      

  3.   

    估计没有执行init(),你就调用了getXianshi(),你可以这么修改然后检查下:public JPanle getXianshi(){
      System.out.println("xianshi=" + this.xianshi);
      xianshi=this.xianshi; // 话说这句话不是多此一举?根本是同一个变量。
      return xianshi;
    }
      

  4.   

    那句话我是写的多余了。
    public MyFrame(String title){
    frame=new JFrame(title);
    frame.setSize(800,700);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    contentPane=frame.getContentPane();
    init();
    }
    我想问一下我那个类外加载的思路对么?
    我现在修改成了主面板中加载,然后在线程类中对各自的对象进行调用修改飞机的位置。这样实现了这个功能。但是又遇到了一个问题:就是:
    private List<Fighter> list;shootBtn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {

    //记录线程的数量n
    n++;
    //初始化一个对象
    shoot[n-1]=new Shoot(n,list);//对进行炮弹的位置初始化
    shoot[n-1].setSize(10,10);
    shoot[n-1].setIcon(zhadan);//显示炸弹的位置
    //初始化炮弹的位置
    shoot[n-1].setLocation(10*i, 10*(j+1));

    xianshi.add(shoot[n-1]);

    //点击一次开火就创建一个新的线程
    new Thread(shoot[n-1]).start();
    }
    });
    这样shoot[n-1]=new Shoot(n,list);//对进行炮弹的位置初始化
    这样每一个Shoot都拥有各自的一个list,每个线程控制一个Shoot,怎样所有的线程都共用同一个list?