0

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

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

然后我的 main 看起来像这样:

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 作为实例变量,它总是这样,我只是在复制我的代码时没有复制它。请检查最后的编辑,它可能会帮助你。我假设我因为其他原因而出错,因为即使我对我认为导致错误的部分发表评论,我仍然会出错。谢谢。

4

3 回答 3

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
于 2013-02-28T17:16:01.653 回答
1

我没有看到在哪里_11声明为实例变量,但我确实看到了你在方法中声明_11paintComponent位置

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);
...
于 2013-02-28T17:16:59.483 回答
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();
     }
}
于 2013-02-28T17:23:10.423 回答