Java applet忽略getWidth()

时间:2013-03-24 06:45:38

标签: java

我正在尝试使用GRect在Java中构建金字塔。我使用getWidth()将金字塔定位在画布的中心,但它往往会跳过金字塔的左侧部分。

我正在通过CS106A学习编程并使用Java 1.6,因此试图获得其他人的代码并且他们也显示了相同的错误。我试图绘制一个简单的矩形,它工作正常。

Java applet是否存在一些问题,因为它往往会忽略getWidth()值。我用过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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我尝试了你的代码,它首先在中心绘制金字塔,但是当我调整查看器窗口大小时问题出现了。 关键是Java applet有一个名为public void paint(Graphics g)的继承方法,每当必须绘制applet时都会调用它。调整查看器窗口的大小是调用paint方法的一种情况。

所以,要解决这个问题,你需要覆盖paint方法,即。添加这样的方法:

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

每次调整窗口大小时都会调用此方法。但请记住,您不需要多个金字塔,因此请在run方法中添加以下行,以便在添加新砖之前删除所有以前的砖块。

    removeAll();