石語り(StoneTalk)(配布ページ)という囲碁の棋譜を表示するJavaアプレットがあるのだけど、これを印刷しようとしてもできないと相談を受けた。例えばこのページ。
手元の環境(IE+1.6、Safari+1.5)で試したところ、確かにアプレットの部分がブランクになってしまい、肝心の盤面が印刷できない。
調べてみたところ、画面表示の方法に問題がある模様。
↓こんな感じに、画面描画のためのGraphicsを、Applet#paint(Graphics)の引数ではなく、初期化時にApplet#getGraphics()で取得してそれをずっと使っている。
public void paint(Graphics g) {
...
newg.drawImage(buffer, 0, 0, null);
}
public void init() {
...
buffer = createImage(mywidth, myheight);
myg = buffer.getGraphics();
newg = getGraphics();
...
}
paintメソッドの最後でbufferを描画しているけど、newgじゃなくてgで描くようにしたら、ちゃんと印刷のイメージに盤面が出るようになった。
たぶん、印刷する前にはブラウザが印刷するイメージのバッファを作成するところ、アプレット初期化時に取得した描画コンテクストだと、そのバッファへ描画するように切り替えができないのだろう。
paintメソッドで現時刻を表示するアプレットを作って試してみたところ、アプレット初期化時にgetGraphicsで取得したGraphicsで描画するプログラムでは、印刷や印刷プレビューをすると、時刻の表示が上書きされることが確認できた。
ということで、Graphicsはpaintメソッドで渡されるものを使うのがよいということ。タイミングによってはNullPointerExceptionになることもあるらしい。