GRect と GOval を使用する GObject クラスを使用して単純な顔を作成しています。GRect と GOval を、getWidth() と getHeight() をインスタンス変数として記述したのと同じ座標に固定する必要があります。そうしてもエラーは表示されませんが、キャンバスに結果がありません。getWidth() と getHeight() をローカル変数として記述した場合にのみ結果が得られます。インスタンス変数の効果が表示されないのはなぜですか?
/*
* This is section 2 problem 2 to draw a face using GRect amnd GOval. The face is centred in the canvas.
* PS: The face is scalable w.r.t. canvas.
*/
package Section_2;
import java.awt.Color;
import java.awt.Graphics;
import acm.graphics.GRect;
import acm.program.GraphicsProgram;
/*
* creates a robot face which is centered in the canvas.
*/
public class RobotFace extends GraphicsProgram{
private static final long serialVersionUID = 7489531748053730220L;
//canvas dimensions for centering
int _canvasWidth = getWidth();
int _canvasHeight = getHeight();
public void run(){
removeAll(); //to make sure multiple instances of graphic are not drawn during resize as an effect of overriding Java paint method
//draw objects
createFace();
}
//currently only createFace() is implemented
/*
* creates a rect which is centred in the canvas
*/
private void createFace() {
//canvas dimensions for centering
//int _canvasWidth = getWidth();
//int _canvasHeight = getHeight();
//make the face scalable
int _faceWidth = _canvasWidth / 6;
int _faceHeight = _canvasHeight / 4;
//to center the face
int _faceX = (_canvasWidth - _faceWidth)/2;
int _faceY = (_canvasHeight - _faceHeight)/2;
GRect _face = new GRect(_faceX , _faceY, _faceWidth, _faceHeight);
_face.setFilled(true);
_face.setColor(Color.BLUE);
add(_face);
}
/*
* (non-Javadoc)
* @see java.awt.Container#paint(java.awt.Graphics)
* to override Java inherited paint method to retain graphic after resizing
*/
public void paint(Graphics g) {
this.run();
super.paint(g);
}
}
getWidth() と getHeight() のローカル変数のコメントを外すと、 Rect が取得されます。それ以外の場合、キャンバスには影響しません。