0

GRect を使用して Java でピラミッドを構築しようとしています。getWidth() を使用してピラミッドをキャンバスの中央に配置しますが、ピラミッドの左側の部分をつまずく傾向があります。

私はCS106AとJava 1.6を使用してプログラミングを学んでいるので、他の人のコードを入手しようとしましたが、彼らも同じバグを示しました. 単純な四角形を描画しようとしましたが、うまく機能します。

getWidth() 値をまったく無視する傾向があるため、Javaアプレットに問題がありますか。println(); を使用しました。getWidth() 値を取得すると機能します。

    import acm.graphics.GRect;
    import acm.program.GraphicsProgram;

    public class Pyramid extends GraphicsProgram {

    /**
     * eclipse generated SVUID
     */
    private static final long serialVersionUID = 5703830460071233096L;

    /** Width of each brick in pixels */
    private static final int BRICK_WIDTH = 30;

    /** Width of each brick in pixels */
    private static final int BRICK_HEIGHT = 12;

    /** Number of bricks in the base of the pyramid */
    private static final int BRICKS_IN_BASE = 14;

    public void run() {
        //centering the pyramid
        int _canvasWidth = getWidth();  //canvas width
        //println(_canvasWidth);    //to check if getWidth returns a value
        int _brickSpace = BRICKS_IN_BASE * BRICK_WIDTH; //space consumed by the base row
        int _freeSpace = _canvasWidth - _brickSpace;    //empty base level space
        int _xOffset = _freeSpace / 2;  //x for left most brick of base row

        for(int row=0; row<BRICKS_IN_BASE; row++){  //the row number
            int _rowTab = (BRICK_WIDTH/2) * row;    //indentaion for each row
            int _brickInRow = BRICKS_IN_BASE - row; //bricks as per row
            for(int _brickNumber=0; _brickNumber<_brickInRow; _brickNumber++){  //placing bricks till _brickInRow
                int x = (_xOffset + _rowTab) + (_brickNumber * BRICK_WIDTH);
                int y = (BRICK_HEIGHT * (BRICKS_IN_BASE - row));    //y as per row num
                GRect _brick = new GRect(x, y, BRICK_WIDTH, BRICK_HEIGHT);  //creating brick instance
                add(_brick);
            }
        }
    }
}
4

1 に答える 1

0

コードを試してみたところ、最初はピラミッドが中央に描画されましたが、ビューア ウィンドウのサイズを変更すると問題が発生しました。要点は、Java アプレットには継承されたメソッドがあり、アプレットを描画public void paint(Graphics g)する必要があるときに呼び出されるということです。ビューア ウィンドウのサイズ変更は、ペイント メソッドが呼び出されるケースの 1 つです。

したがって、これを修正するには、ペイント メソッドをオーバーライドする必要があります。そのようなメソッドを追加します:

    public void paint(Graphics g) {
    this.run();
    super.paint(g);
    }

このメソッドは、ウィンドウのサイズが変更されるたびに呼び出されます。ただし、複数のピラミッドは必要ないので、次の行をrunメソッドに追加して、新しいレンガを追加する前に以前のレンガをすべて削除してください。

    removeAll();
于 2013-03-24T07:28:27.717 に答える