>>599
訂正。
603と605で書いたのは嘘だった。ごめん。
>Image im;
>をクラスのフィールドとして、クラス定義のはじめに書いて、コンストラクタでは
>im = createImage(300,300);
>とする必要がある。
上記の「コンストラクタでは」というのが嘘。コンストラクタでは、まだCanvasが
表示されていないため、Imageが作れず、createImageがnullを返す。

で、解決法として簡単なのは、BufferedImageを使うこと。
コンストラクタの中で、
im = BufferedImage(300,300,BufferedImage.TYPE_INT_RGB);
page = im.getGraphics();
とする。
BufferedImageは java.awt.imageパッケージにあるから、importを
忘れずに。

createImageでいくなら、コンストラクタではなく、別に例えば
void createBufferImage()というメソッドを用意して、その中で、
im = createImage(300,300);
page = im.getGraphics();
を行う。
で、このcreateBufferImage()を、Mycanvasを含むフレームを表示
した後で呼ぶ。例えば、
MyCanvas mc = new MyCanvas();
frame.add(mc);
frame.setSize(400,400);
frame.show();
mc.createBufferImage();
といった具合。

いずれも、imとpageは、クラスのフィールドとすることは同じ。

以上、お詫びと訂正まで。