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

そして、私は次のようなメインを持っています:

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メソッドがnullポインター例外を返すことです。私は 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

がインスタンス変数として宣言されている場所はわかりませんが、メソッドで_11a を宣言する場所はわかります_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 に答える