0

これまでのところ、実際にメソッドに入っていたことを確認するためだけに、いくつかの印刷行を含む私のコードです。なんらかの理由でキャンバスに何も描画されていません。描画に関する限り、これに似たプログラムがあり、正常に動作します。これの何が問題なのですか?

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.*;

public class gameOfLife implements ActionListener {
  private int height;
  private int width;
  private Graphics g;
  private JPanel panel;
  private JFrame frame;
  int[][] board= new int[40][40];

  /**
  * @param args
  */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    gameOfLife gui = new gameOfLife();
  }

  public gameOfLife() {
    int height=400;
    int width=400;
    frame= new JFrame("Keegan's Game Of Life");
    frame.setSize(new Dimension(height,width));
    frame.setLayout(new BorderLayout());
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
    g=frame.getGraphics();
    drawBoard();
  } 

  public void drawBoard() {
    g.setColor(Color.BLUE);
    g.drawLine(0, 0, 50, 50);
    g.fillOval(50,50,10,10);
    System.out.println("Done Drawing");
    g.drawString("IT WORKED!", 100, 100);
  }

  @Override
  public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
  }
}
4

2 に答える 2

2

から始めましょうg=frame.getGraphics();

これは非常に悪い考えであり、カスタム ペインティングの実行方法ではありません。 getGraphics戻る可能性がnullあり、通常は最後のペイント サイクルのスナップ ショットにすぎません。このメソッドを介してGraphicsコンテキストに描画されたものはすべて、次の再描画サイクルで破棄されます。

コンテキストへの参照は保持しないでくださいGraphics。それらは一時的なものであり、ペイント サイクル間で同じオブジェクトではない可能性があります。

代わりに、自分でカスタム コンポーネント (のようなもの) を作成し、そのメソッドJPanelをオーバーライドします。paintComponent

詳細については、カスタム ペインティングの実行を参照してください。

更新しました

この簡単な例でアイデアを確認できます...

于 2013-02-08T04:53:58.030 に答える
0

キャンバスでオーバーライドできますpaint(Graphics g)。そうしないと、キャンバスが無効になると (たとえば、移動したり、別のウィンドウで覆われたりして)、描画が消えます。

JFrameクラスを拡張してメソッドをオーバーライドできるようにする方が簡単かもしれませんpaint。そうでない場合は、匿名クラスを使用できます。

frame = new JFrame("Keegan's Game Of Life") { //override paint here }

ただし、アプリケーションがGame Of Lifeのアニメーションを作成することを目的としている場合は、JFrame でこれを行うべきではありません。JPanelまたはの使用を検討してください。Canvas

于 2013-02-08T04:53:14.613 に答える