我在一个方法中创建一个对象,我试图在其他方法中使用它

时间:2013-02-28 17:12:33

标签: java

所以我的代码看起来像这样:

class Pozadina extends JPanel implements MouseListener {
  ArrayList<Pozicija> list;
  public Pozicija _11;

    public void paintComponent(Graphics g){

                ArrayList<Pozicija> list=new ArrayList<Pozicija>();
                Pozicija _11=new Pozicija();
                _11.setCoords(korak,korak);
                list.add(_11);

                //lots of drawing here

                for (Pozicija p:list) {
                    if (p.getBelongsTo()==1){
                        g.setColor(Color.blue);
                    }

                    g.fillOval(p.getX(), p.getY(), 20, 20;
                    g.setColor(Color.black);
                }//for loop
       }//paintComponent method

然后我的主要看起来像这样:

public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(630,630);
            Pozadina pozadina= new Pozadina();
            frame.getContentPane().add(pozadina);
            frame.addMouseListener(pozadina);
            frame.setVisible(true);
        }

点击事件如下:

public void mouseClicked(MouseEvent e) {
            _11.setPlayer1();
            pozadina.repaint();
        }

所以问题是我在图形中创建_11对象,因此鼠标Clicked方法返回空指针异常。我有Pozicija _11;设置为类的实例变量,但它不起作用。我试图弄清楚如何避免这种情况,但我对java很新,而且我没有想法。

编辑:即使我这样做,我也会收到Null Point Exception错误。 :S

public void mouseClicked(MouseEvent e) {
                /*_11.setPlayer1();
                pozadina.repaint();*/
            }

它告诉我它的行“/ * _ 11.setPlayer1();”。不知道发生了什么。

我确实尝试了2个发布的建议,我总是将_11作为一个类中的实例变量,我只是没有在这里复制。

EDIT2:首先,感谢所有答案。 :D我已经更新了我的代码,以显示我有list和_11作为实例变量,它总是这样,我只是在我复制代码时没有复制它。请检查上次编辑,它可能会帮助你。我假设我因为别的东西而得到错误,因为即使我对我所考虑的部分发表评论导致错误,我仍然会得到错误。感谢。

3 个答案:

答案 0 :(得分:1)

您必须在类环境中定义_11,否则如果不直接作为输入传递,则无法从另一个方法中获取方法中定义的变量。

class Pozadina extends JPanel implements MouseListener {

     public Pozicija _11;

     public void paintComponent(Graphics g){

            ArrayList<Pozicija> list=new ArrayList<Pozicija>();
            _11=new Pozicija();
            _11.setCoords(korak,korak);
            list.add(_11);

            //lots of drawing here

            for (Pozicija p:list) {
                if (p.getBelongsTo()==1){
                    g.setColor(Color.blue);
                }

                g.fillOval(p.getX(), p.getY(), 20, 20;
                g.setColor(Color.black);
            }//for loop
      }//paintComponent method

答案 1 :(得分:1)

我没有看到_11被声明为实例变量的位置,但我确实在_11方法中看到了paintComponent的声明

Pozicija _11=new Pozicija();
_11.setCoords(korak,korak);
list.add(_11);

现在,如果这不会使您的代码无法编译,那么唯一的逻辑结论就是它将任何现有的实例变量_11放在该方法的其余部分的范围之外,并且它不会被更改如果你对它采取任何措施。


为了使它成为一个实例字段,必须在方法之外声明它,如此

class Pozadina extends JPanel implements MouseListener {

    public /*or private*/ Pozicija _11;

    public void paintComponent(Graphics g){
        ArrayList<Pozicija> list=new ArrayList<Pozicija>();
        _11=new Pozicija();
        _11.setCoords(korak,korak);
...

答案 2 :(得分:0)

在Pozina构造函数中保存_11变量并将其从paint()方法中删除。

您的代码可能看起来像这样:

class Pozadina extends JPanel implements MouseListener {
    private Pozicija _11;
    ArrayList<Pozicija> list=new ArrayList<Pozicija>();            

    public Pozadina(){
        _11=new Pozicija();
    }

    public void paintComponent(Graphics g){

        _11.setCoords(korak,korak);
        list.add(_11);

        //lots of drawing here

        for (Pozicija p:list) {
            if (p.getBelongsTo()==1){
                g.setColor(Color.blue);
            }

         g.fillOval(p.getX(), p.getY(), 20, 20;
         g.setColor(Color.black);
            }//for loop
   }//pa

     public void mouseClicked(MouseEvent e) {
         _11=new Pozicija();
         _11.setPlayer1();
         pozadina.repaint();
     }
}