5

これは課題だと言って始めたいと思います。答えのスプーンが与えられたくないのですが、問題の原因を知りたいです。

私は現在コンウェイの人生ゲームを実装しています。セルをクリックすると、そのセルが生きている状態に切り替わっていることを表すため、色が変わります。もう一度クリックすると、デフォルトの色に戻ります。

ウィンドウのどこかをクリックすると、プログラムは 56 行目でヌル ポインター例外をスローします。ありがとう!

コードは次のとおりです。

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){}



}
4

2 に答える 2

3

ここでの問題は、rect フィールドが何にも設定されないため、そのままになることnullです。呼び出すrect.drawRectと、表示されているNullPointerExceptionが発生します。

私の記憶が正しければ、SwingGraphicsオブジェクトは、あなたが絵を描くことを期待していないときに、あなたが絵を描くことを本当に嫌います。したがってGraphics、への呼び出し中に取得したオブジェクトをpaint()などのフィールドに隠さないことをお勧めしますrect。ウィンドウの一部を再描画する場合は、ウィンドウのどの部分を再描画する必要があるかをSwingに通知してから、paint()メソッドを呼び出させることをお勧めします。

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

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

  • j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);に行を追加することをお勧めしmain()ます。この行により、ウィンドウを閉じたときにアプリケーションが適切に終了します。
  • 現在、コードは、単一のセルが変更されるたびに75×75グリッド全体を再描画しています。変更されたセルのみを再描画するようにコードを変更できるはずです。repaint()メソッドにaを渡すRectangleことができます。これは、Swingに「コンポーネントのこの部分のみを再ペイントする必要がある」ことを通知します。このメソッドでは、クラスメソッドをpaint使用してこの長方形を取得し、それを使用して、再描画する1つまたは複数のセルを決定できます。getClipBounds()Graphics
  • drawRect長方形の輪郭のみを描画します。セルが死んだ場合、paintメソッドはグリッドから既存の黒い長方形をクリアしません。これを修正するには、死んだセルを、上部に黒い輪郭の長方形が付いた白い塗りつぶされた長方形として描画します。
于 2012-04-29T08:53:55.587 に答える
0

CellGridオブジェクトがセルで埋められていますか? 私はJavaの専門家ではありませんが、あなたのコードにはこの初期化が見られません...

于 2012-04-29T05:37:20.690 に答える