Tag Archives: Java

「石語り」というJavaアプレットが印刷できない件

石語り(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になることもあるらしい。

【どう書く?org】数独の問題数を数え上げる

よく見る数独は3×3×3だけど、2×2×2のサイズの大きさで、解ける問題ははいくつあるか数えるという設問。
こういうパズルの解法ロジックに関わるようなものを作るのは初めてかも。頭の中でアナログに解法を考えて、それを抽象化しながらコードにしていくというプロセスが思いのほかおもしろい。
とりあえず何時間かかけて、解く方のプログラムはできたぽい。ぽいというのは問題を公開しているサイトの問題を入れてみたら解けて、自分で適当な数字を入れて解かせてみたら、おかしな結果にならず解けない問題は解けないということが経験的に何となく確からしいかなという話。
解法のロジックができたら後は早いかと思っていたけど、甘かった。解ける問題を数え上げる方法は、適当に総当たりでしらみつぶしにしていこうかと思ったけど、場合の数が多すぎ。
予めある数字がnこある場合、16Cn×4n通り。天文学的数字の予感。n=3の場合で既に215,040通り。これは無理だ。
何とかして問題を絞るか、あるいはやり方を変えて、完成図の方から空白を入れていく方法にするとかかなあ。むずい。なかなか投稿者が出ないだけある。