2011年5月24日火曜日

久しぶりのJAVAプログラミング

土星の運動を記録しているのだが、やはりkeynoteを使った手作業は時間も手間もかかるので、少し作業を自動化したいと思い始めた。そこで、javaを使ったプログラミングを久しぶりにやってみようと思い立った。

appletにして公開するのはまだ先の事として、まずは自分で使うアプリケーションの開発をやることにした。いつもは数値計算だけしかやらないので、画像処理やGUIに関してはかなり記憶が不確かになっていて苦しんだ。

たしか、富士山の画像を動かして遊んだのは修士にいた頃だった。FMVにSlackwareを入れて、Blackdownでやった記憶がある。DOOMの攻略に燃えていた記憶もよみがえって来た。

それはともかく、あのとき使った教科書は古くて、動く事は動くのだが、「推奨されません」とエラーメッセージがたくさん出て面倒くさい。ネットで情報を集め、なんとかがんばって、EventListener関連をマスターする。(新しい教科書を買ってきたほうがいいかも。)最初の洗礼はmouseExitedがオーバーライドできません、というエラー。調べると、いちいち手で全部定義してやらないといけないとのこと。mouseExited, mouseEntered,などなど全部書かされるはめに。この辺りなんとかうまく回避する方法がきっとあるんだろうが、今は早く画像処理プログラムを完成させるのが目的なので、しぶしぶ云われた通りにして、エラーメッセージを消す。

次の問題が、画像処理に関する事。まず困ったのが、getImageがappletのみのメソッドだということ。なんとかToolkitクラスの発掘にたどり着き、addImageで画像データを読み込めるようになった。

そして、更なる問題が....Imageクラスのメソッドの一つ、getWidth()の戻り値が-1となってしまう問題。つまり、プログラムは動いているのの、画像が読めませんよ、という結果になってしまうのだ。画像の幅が−1になったんでは、表示のしようがない....ほとほと困ってしまった。もしかすると、ハッシュとか局所メモリの破壊とか、そういう感じの問題かな、と思って、2、3度同じ命令を繰り返させてみた。すると、ときどき640とか320とか、ちゃんとサイズを読み取ってくれる。おもしろいのは、実行によって結果が変わる事。−1に戻ったりもする。なんじゃこりゃ???

この結果をもとに、ネットサーチをかけると、あったあった。なんと、javaの実行速度と、画像の読み込み速度のミスマッチから来る問題だったのだ。たまたま、キャッシュなどにデータが置かれ、画像の読み込みが早くなると、640とかちゃんとした値が出るのだが、SSDなど外部の記憶装置などからデータがくる場合は、時間的に遅くなってしまうため、プログラムが先に行ってしまって「画像がない」と文句をいうのであった。このシンクロを行わせるクラスがあることを見つけた。MediaTrackerというらしい。こいつを挟んで、画像処理させると、ちゃんとした値が確保されることが判明した。

こうして、なんとか画像データのサイズを取得し、それを画面に表示させる「部品」プログラムが完成した。久しぶりにやると、結構楽しい。

0 件のコメント: