その後,ATOK の挙動を詳しく調べてみたところ,「ATOK 入」の状態だと,JFrame を開閉する度に3〜4MB のメモリがどんどん消費されていくことが分かった。つまり,例えば1カルテの記入で,インスペクタ,カルテエディタ,数個のスタンプエディタ,シェーマエディタを開き,それぞれ編集して終了というような 10回程度のフレーム開閉があるとすると,1カルテを編集しただけで,30〜40MB のメモリが消費されてしまう。そのまま 20カルテ程度記載すると,消費メモリは 600〜800MB になって,あえなく ATOK はクラッシュする。
当然ながら「ATOK 切」の状態であれば ATOK の消費メモリは増えないので,フレームの開閉の際に,ATOK をこまめに切ることができれば,ATOK のメモリ消費を抑えることができるはずである。
Window#getInputContext() でとってきた InputContext を使って inputContext.selectInputMethod(Locale.US) のようにすると InputMethod の切換ができる。
JFrame f = new JFrame();
InputContext ic = f.getInputContext();
ic.selectInputMethod(Locale.US);
しかし,ATOK のメモリ消費を抑えるためには JFrame ができる前に U.S. に切り替わっていなければだめなので,この方法は使えない。どうしたものかと悩んでいたら,あるサイトで,AppleScript で System Events に「かな」キーと「英数」キーの key code を送って ime の on/off をする方法が紹介されていた。これを使って,ATOK をこまめに切るようにプログラムしてみた。
ポイントは,「かな」キーで「ATOK 入」,「英数」キーで「ATOK 切」となるような設定である。これは下の左の画像のような設定ではダメで,右の状態になるように「言語とテキスト」設定画面の「入力ソース」を設定する。
具体的には,チェックマークを「U.S.」と,ATOK の「ひらがな」だけにする。
これを使った ime on/off のスクリプト(IMEControl.java,ExecuteScript.java, AppleScriptExecutor.java)を随所に組み込んで,JFrame の開閉時に可及的に ATOK を off にするようにしたところ,ATOK メモリ消費を約10分の1 に抑えることができた。これなら,お昼休みに1回 ATOK リセットすれば乗り切れる。
この ime on/off の問題点は,System Events にキーコードを送るという方法なので,送信時にコマンドキーなどが押されているとうまくいかないという点である。コマンドーWでウインドウを閉じようとして,ぼんやりコマンドキーを押しっぱなしにしていると,いくら System Events に「英数」キーを送っても「コマンドー英数」になってしまうので,ime off にならない。この問題は,コマンドーWの後にすぐにキーを離すように特訓をして解決した。