0
    public void actionPerformed(ActionEvent e){
             grid=new JButton[length+20][width+20];
             grid1=new JButton[length+20][width+20];

            for(int i=0;i<length+2;i++)
            {
                for(int j=0;j<width+2;j++)
                {
                    grid1[i][j]=grid[i][j];
                }
            }


            for(int i=1;i<length+1;i++)
            {
                for(int j=1;j<width+1;j++)
                {
                    //final int row = i;
                    //final int col = j;

                    int count=0;

                    if(grid[i][j-1].getBackground() == Color.BLACK);
                        count++;

                    if(grid[i][j+1].getBackground()==Color.BLACK)
                        count++;

                    if(grid[i-1][j-1].getBackground()==Color.BLACK)
                        count++;

                    if(grid[i-1][j].getBackground()==Color.BLACK)
                        count++;

                    if(grid[i-1][j+1].getBackground()==Color.BLACK)
                        count++;

                    if(grid[i+1][j-1].getBackground()==Color.BLACK)
                        count++;

                    if(grid[i+1][j].getBackground()==Color.BLACK)
                        count++;


                    if(grid[i+1][j+1].getBackground()==Color.BLACK)
                        count++;

                    if(count==3)                    // exactly three neighbors
                    {

                        if(grid[i][j].getBackground()==Color.WHITE)
                        {
                            grid1[i][j].setBackground(Color.BLACK);         // birth cell
                        }
                    }

                    if(count==2 || count==3)            // 2 or 3 neighbors
                    {

                        if(grid[i][j].getBackground()==Color.BLACK)
                        {
                            grid1[i][j].setBackground(Color.BLACK);         // survives
                        }
                    }

                    if(count>=4 || count<=1)            //4 or more neighbors, or 1 or less neighbor
                    {
                        if(grid[i][j].getBackground()==Color.BLACK)
                        {
                            grid1[i][j].setBackground(Color.WHITE);         // dies from over-population or isolation
                        }
                    }
                }
            }

            for(int i=0;i<length+2;i++)
            {
                for(int j=0;j<width+2;j++)
                {
                    grid[i][j]=grid1[i][j];
                }
            }

            for(int i=1;i<length+1;i++)
            {
                for(int j=1;j<width+1;j++)
                {
                    System.out.print(grid[i][j]);
                }
                System.out.println("\n");
            }
        }

GUI を使用して次世代のコンウェイ ライフ ゲームを表示しようとすると、nullpointer 例外が発生します。私のコードの問題点を教えてください。アクション実行メソッドは、開始ボタンがクリックされたときに実行されます

4

1 に答える 1

2

NullPointerException の原因は次のとおりです。

grid  = new JButton[length+20][width+20];
grid1 = new JButton[length+20][width+20];

このようにして、 の 2D 配列が得られますが、JButtonsまだnull値がいっぱいです。配列内の個々の「セル」を初期化する必要があります。

for (int i = 0; i < length+20; i++) {
    for(int j = 0; j < width+20; j++) {
        grid1[i][j] = new JButton();
    }
}

また、配列のサイズは意図的なものですか、それとも for ループのように代わりにlength+2xにする必要がありますか?width+2

しかし、これは実際の問題ではありません。新しいボタン配列を作成し、新しく作成したボタンの背景色を確認します。gridがゲームの現在の状態を表していると仮定すると、更新を行う前にゲームの状態を消去しています。おそらく、回線をgrid = new JButton[length+20][width+20];完全にドロップする必要があります。

2 つのアレイが同じgridボタンをgrid1保持するため、これでも正しく機能しません。そのため、一方の背景色を変更すると、バックアップの背景色も変更されます。ボタンへの参照を他の配列にコピーするだけで、新しいボタンは作成しません。そうしたとしても、その新しいボタンが GUI にまったく表示されないという問題が発生します。grid1[i][j]=grid[i][j]

ゲームの状態を GUI 要素に保存する代わりに、ブール値の 2 つの 2D 配列 (1 つは現在の状態用、もう 1 つは状態更新中の前の状態のバックアップとして) を使用し、ボタンの背景色を以下に基づいて設定する必要があります。それらのブール値。

于 2013-10-25T08:21:01.583 に答える