2012-04-29 17 views
5

これは割り当てであると言うことから始めたいと思います。私は答えのスプーンが私に与えられるのを望んでいないが、何が私の問題を引き起こしているのか知りたい。Java:グリッド上の長方形で塗りつぶす

私は現在ConwayのGame of Lifeを実装しています。セルをクリックすると、そのセルがアライブ状態に切り替わることを表す色が変更されます。再度クリックすると、デフォルトの色に戻ります。

私がウィンドウのどこかをクリックすると、プログラムは56行目にNull Pointer Exceptionをスローします。最後の1日ほどでこれに固執しています。ありがとう!

相続コード:

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

public class VisibleGrid extends JPanel implements MouseListener, KeyListener{ 

    CellGrid cellGrid; 
    Graphics rect; 

    public VisibleGrid(){ 
    addMouseListener(this); 
    cellGrid = new CellGrid(); 
    } 

    //Draw the grid of cells, 7px wide, 75 times to create 75x75 grid 
    public void paint(Graphics g){ 
    for(int i=0; i<525;i=i+7){ 
     for(int j = 0; j<525; j=j+7){ 
     g.drawRect(i ,j,7,7);  
     } 
    } 
    } 

    //auxillary method called to fill in rectangles 
    public void paint(Graphics g, int x, int y){ 
    g.fillRect(x, y, 7, 7); 
    repaint(); 

    } 

    //main method, adds this JPanel to a JFrame and sets up the GUI 
    public static void main(String[] args){ 
    JFrame j = new JFrame("Conway's Game of Life"); 
    j.setLayout(new BorderLayout()); 
    j.add(new VisibleGrid(), BorderLayout.CENTER); 
    JTextArea info = new JTextArea("Press S to Start, E to End"); 
    info.setEditable(false); 
    j.add(info, BorderLayout.SOUTH); 
    j.setSize(530,565); 
    j.setVisible(true); 
    } 

    //these methods are to satisfy the compiler/interface 
    //Begin Mouse Events 
    public void mouseExited(MouseEvent e){} 
    public void mouseEntered(MouseEvent e){} 
    public void mouseReleased(MouseEvent e){} 
    public void mousePressed(MouseEvent e){} 
    public void mouseClicked(MouseEvent e){ 
    //fill the selected rectangle 
    rect.fillRect(e.getX(), e.getY(), 7,7); 
    repaint(); 

    //set the corresponding cell in the grid to alive 
    int row = e.getY() /7; 
    int column = e.getX() /7; 
    cellGrid.getCell(row, column).setAlive(true); 
    } 
    //End Mouse Events 

//These methods are to satisfy the compiler/interface 
//Begin KeyEvents 
    public void keyReleased(KeyEvent e){} 
    public void keyPressed(KeyEvent e){} 
    public void keyTyped(KeyEvent e){} 



} 
+1

どの行が56行目ですか?コードをコピー/ペーストすると、int column = e.getX()/ 7;それは正しく表示されません –

+0

私はベットライン56が_rect.fillRect(e.getX()、e.getY()、7,7); _ –

+0

です。@guidoによれば、グラフィックスオブジェクトである 'rect'それにアクセスする前に、初期化されているか、または有効な参照があります。 – Rupak

答えて

3

rectフィールドは決してnullのように設定されていません。 rect.drawRectを呼び出すと、あなたが見ているNullPointerExceptionが発生します。

私が正しく覚えていれば、スウィングGraphicsは、あなたが絵を描くことを期待していないときに、絵を描くのが本当に好きではありません。したがって、rectのようなフィールドでpaint()へのコール中に取得するGraphicsオブジェクトを隠すことをお勧めします。ウィンドウの一部を再描画する場合は、ウィンドウのどの部分を再ペイントする必要があるかをSwingに伝えてから、paint()メソッドを呼び出すようにしてください。

mouseClicked()メソッド内では、rect.fillRect()への呼び出しを削除し、repaint()にメソッドを最後まで移動しました。私はまた、paint()メソッドを変更して、セルが生きていれば塗りつぶし矩形を描画し、そうでなければ塗りつぶし矩形を描きました。これを実行した後、コードが動作しているように見え、いくつかのセルをクリックすると黒くなります。

あなたのコードを改善するための提案がいくつかあります。私はあなたのための演習として、最後の2を残しておきます:

  • 私はmain()にラインj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);を追加することをお勧めしたいです。この行は、ウィンドウを閉じるときにアプリケーションを適切に終了させます。
  • 現時点では、1つのセルが変更されるたびにコードがグリッド全体を再ペイントしています。変更されたセルのみを再描画するようにコードを変更することは可能です。 pass a Rectangle to the repaint() methodは、Swingの「このコンポーネントのうちの私のコンポーネントだけを再描画する必要がある」と伝えます。 paintメソッドでは、the getClipBounds() method of the Graphics classを使用してこの矩形を保持し、それを使用して再描画するセルを決定できます。
  • drawRectは、四角形の輪郭線のみを描画します。セルが消滅すると、paintメソッドはグリッドから既存の黒い矩形を消去しません。あなたは死んだ細胞を上に黒い輪郭の矩形が付いた白い塗りつぶしの矩形として描くことでこれを修正することができます。
+0

非常に有益な答えをありがとうございました!私は今、ゲームのほぼ完全な実装を持って、私はちょうど実際のゲームのアルゴリズムを完了する必要が、GUIの部分が行われます。もう一度、ありがとう。 – NickD720

0

あなたはCellGridオブジェクトが細胞で満たされていますか?私はJavaの専門家ではありませんが、あなたのコードではこの初期化は表示されません。

+0

はい、CellGridオブジェクトは、そのコンストラクタのCellオブジェクトで埋められます。私はプログラムのGUI部分をすぐに理解しました。ありがとう! – NickD720

関連する問題