2011-02-08 7 views
1

まずは初心者です。私はPieceの配列を使ってパズルゲームを作ろうとしています。各Pieceは1から9の数字を表します。paintComponent(Graphics g)を使用してペイントしようとしていますが、repaint()メソッドを呼び出すと何も起こりません。エラーはないので、私が気付いていない点があるはずです。repaint()を呼び出すと何も塗装されないのはなぜですか?

私はNetBeansを使用しています。私は新しいデスクトップアプリケーションを作成し、JPanelJButtonを追加しました。

これは私のコードです:

public class PuzzleGame2View extends FrameView { 

public Piece pieces[][]; 

Drawing outer = new Drawing(); 

public PuzzleGame2View(SingleFrameApplication app) { 

super(app); 

initComponents(); 
//more code that netbeans automatically wrote...... 

public class Drawing extends JFrame implements MouseListener{ 
    public void paintComponent(Graphics g){ 
     g = jPanel1.getGraphics(); 
     super.paintComponents(g); 

     for (int i = 0; i < pieces.length; i++) { 
      for (int j = 0; j < pieces.length; j++) { 
       if (pieces[i][j].getText()!=null) { 
        g.setColor(Color.red); 
        g.fillRect(i*100, j*100, 100, 100); 
        g.setColor(Color.BLACK); 
        g.drawString(pieces[i][j].getText(), i*100 + 50, j*100 + 20); 

       } 
      } 
     } 
    } 

    public void makePieces(){ 
    pieces = new Piece[3][3]; 
    for (int i = 0; i < pieces.length; i++) { 
     for (int j = 0; j < pieces.length; j++) { 
      if (i == 2 && j == 2){ 
       pieces[i][j] = new Piece(j, j, null); 
      } 
      else 

      pieces[i][j] = new Piece(j, j, "" + (i*3+j+1)); 
     } 
    } 
} 

私はボタンをクリックしたときにrepaint()メソッドを呼び出すようにしようとしています。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    // TODO add your handling code here: 
makePieces(); 
outer.repaint(); 
}     

はここのクラスPiece

package puzzlegame2; 

public class Piece { 
private int row,count; 
private String text; 

public Piece(int row, int count, String text) { 
    this.row = row; 
    this.count = count; 
    this.text = text; 
} 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 
} 

それはちょうど最初のステップです。やるべきことがたくさんある。しかし、public void paintComponent(Graphics g)repaint()の仕組みを完全に理解するまでは続行できません。

だから、助けていただければ幸いです。

+0

線g = jPanel1.getGraphicsを再描画revalidate()電話をしてみてください。 public void paintComponent(Graphics g) 何も試していないのにうまくいきませんでした。 – Max

+0

問題を実証し、コードを再発行できる最小の実行可能プログラムを作成することをお勧めします。 – willcodejavaforfood

+1

「パブリックvoid paintComponent(Graphics g)」と「repaint()」がどのように機能するかを完全に理解するまでは、私は続行できません。多くの人がそれを混乱させようとします。 – Pops

答えて

2

paintComponents()の代わりにpaint()メソッドを上書きしてみてください。 repaint()paint()に電話を送信します。

編集:いずれの場合でも変更する必要があることは、JFramepaintComponent()メソッドをオーバーライドしていることです。代わりにJPanelのこのメソッドをオーバーライドして、新しいパネルをJFrameのコンテンツパネルとして設定する必要があります。パネル上でrepaint()に電話してください。

+1

あなたは私の答えを無視するべきでしょうか?このガイドpaintComponent()によると、paint()によって呼び出されるため、repaint()が呼び出されるときに呼び出されます。http://download.oracle.com/javase/tutorial/uiswing/painting/ closer.html – pajevic

+0

あなたの答えをありがとうが、私はまだそれを試してもうまくいきませんでした。私は、ブレークポイント(public void paintComponent(Graphics g))としてこの行を選択した後にデバッグするとき、緑色に変わらないので、呼び出されていないので、問題は依然として問題ではないかと思います。 – Max

+0

YEAH!それは本当です...しかし、それはまだ解決されていません...他に何かがありません...しかし、私はJFrameのコンテンツパネルとして新しいパネルを設定するために何をすべきです... netbeansは自動的に行うのではないですか? ? – Max

関連する問題