インプットメソッドは、キー入力、音声入力、ペンデバイスを使った手書き入力などのユーザー操作を変換し、アプリケーションへのテキスト入力を生成するソフトウェアコンポーネントです。もっとも一般的なインプットメソッドは、中国語や日本語や韓国語など数千の異なる文字を使う言語のテキストを、通常のサイズのキーボードで入力できるようにするためのものです。テキストの入力は通常サイズのキーボードで扱える形式 (たとえばローマ字) で行われて、入力されたあとでテキストは目的の言語の形式に変換されます。一般に、複数の文字を入力してから、1 つのかたまりとして変換する必要があります。また、変換候補が 1 つだけではないこともあるので、変換を繰り返し行わなければならない場合があります。同様に、手書き文字の認識では、ユーザーは一連の文字を書き、変換し、複数の変換結果候補から正しいテキストを選択します。このプロセスを変換と呼び、インプットメソッドの作業対象になっているテキストを変換テキストと呼びます。このプロセスはユーザーが最終的な変換結果を確定すると終了し、テキストが確定します。
変換中は、変換テキストは論理的に言ってインプットメソッドに属していますが、ユーザーに対して表示する必要があります。そのために、Input Method Framework はインプットメソッドと協調して、少なくとも 2 種類の方法を提供します。最新のテキスト編集コンポーネントの場合は、最終的に配置されることになるドキュメント内の位置に、インプットメソッドによる変換または確定がまだ必要であることを示す形式で、入力テキストを表示できます。この方法を、オンザスポットスタイルの入力と呼びます。また、確定してからでないとテキストを扱えない旧式のテキスト編集コンポーネントの場合は、代替手段として、テキストを別のウィンドウで表示できるようにします。この方法を、ルートウィンドウスタイルの入力と呼びます。
Java 2 プラットフォームの Input Method Framework は、テキスト入力時に、テキスト編集コンポーネントとインプットメソッド間の共同作業を可能にします。この Input Method Framework のインプットメソッドクライアント API は、テキスト編集コンポーネントがインプットメソッドと通信し、十分に統合されたテキスト入力ユーザーインタフェースをオンザスポットスタイルまたはビロウザスポットスタイルで実装することを可能にするインタフェースとクラスを提供します。また、この API は、代替手段としてルートウィンドウスタイルの入力方法を提供します。この API のインプットメソッドエンジン用の Service Provider Interface (SPI) は、任意の Java 実行環境で使える Java プログラミング言語を使ったインプットメソッドの開発を可能にするインタフェースを提供します。また、この SPI は、ホストプラットフォームのネイティブなインプットメソッドをサポートします。
Input Method Framework を使うテキスト編集コンポーネントは、任意の Java アプリケーション環境で動作し、その Java アプリケーション環境で利用可能なテキストインプットメソッドをサポートします。テキスト編集コンポーネントの変更または再コンパイルは、必要ありません。Input Method Framework によって、テキスト編集コンポーネントは、プラットフォームおよびインプットメソッドエンジンの間にある違いから切り離されます。インプットメソッドと対話するための方法として、ただ 1 つのプログラミングモデルが提供されます。これにより、開発者は 1 つの API に対してだけプログラムを記述すればよく、ユーザーは目的に合ったインプットメソッドを選択できます。ネイティブなインプットメソッドを使うと、Input Method Framework によってプラットフォームのインプットメソッド API にマッピングされます。
ほとんどの開発者にとってエンジンの独立性は重要なことですが、高度な機能の開発者には、エンジンに固有の機能が必要になる場合があります。Input Method Framework ではこの必要を満たすことができます。
Java プログラミング言語で記述され、インプットメソッドエンジン SPI を使用するインプットメソッドは、任意の Java アプリケーション環境にインストールして、その Java アプリケーション環境で動作する任意のテキストコンポーネントをサポートすることができます。Input Method Framework によって、インプットメソッドは、プラットフォームおよびテキスト編集コンポーネントの間にある違いから切り離されます。テキストコンポーネントと対話するための方法として、ただ 1 つのプログラミングモデルが提供されます。これにより、開発者は 1 つの SPI に対してだけプログラムを記述すればよく、ユーザーは目的に合ったテキスト編集コンポーネントを選択できます。
Input Method Framework は、完全に世界共通のアプリケーションに対するニーズにこたえるため、言語に依存しません。インプットメソッドは、主に東アジア系の言語のテキスト入力に使われますが、ほかの言語に対しても同じように役に立つ場合があります。たとえば、ラテン文字を使ってギリシャ文字を入力するための文字変換用インプットメソッドを作ることができます。
フレームワークは、異なる言語のインプットメソッドを同時に処理して、真の多言語テキスト編集を実現します。ホストオペレーティングシステムによってネイティブなインプットメソッドの選択が制限される場合があるのに対し、Java プログラミング言語で記述され、インプットメソッドエンジン SPI を使用する任意のインプットメソッドは、いつでも使用できます。テキストの言語に対応した操作をアプリケーションで実行できるよう、インプットメソッドで作成されたテキストには言語属性を持たせることができます。
Input Method Framework は、さまざまな入力装置に対応できるように設計されています。現在、テキスト入力の手段はほとんどキーボードですが、ほかの装置の重要性も増しつつあります。テキスト入力の方法として、ペン入力だけを採用しているプラットフォームもあります。また、音声入力も広く普及しつつあります。インプットメソッドエンジン SPI によって、これらの代替装置のサポートが可能になります。
プログラムが異なれば、インプットメソッドのサポートに対するニーズも異なります。インプットメソッドとの統合を緊密にすれば、ユーザーインタフェースはいちばん良くなりますが、追加のプログラミングが必要になります。そうした追加の作業をする価値を認めない開発者でも、東アジア系の言語のテキスト入力を受け取ることができるアプリケーションを開発しなければならない場合があります。ゲームなどのプログラムの中には、インプットメソッドの介入を受けずに、低レベルのキーボード入力を直接受け取るものもあります。フレームワークでは、次に示すテキスト入力サポートのレベルから、プログラムが適切なものを選択できるようになっています。
東アジア地域の言語での使用を目的として作られている最近のプログラムは、通常、完全に統合化されたユーザーインタフェースを持つテキスト入力操作機能を備えており、変換テキストはドキュメントテキストに埋め込まれて表示されます。テキストの変換では、現在の候補は反転表示されていて、ユーザーが別の候補を選択すると、前の候補テキストは新しい候補テキストに置き換えられます。インプットメソッドに対するこのようなユーザーインタフェースサポートは、オンザスポットスタイルまたはインラインスタイルと呼ばれています。中国語を話すユーザーが好む別の方式は、ビロウザスポットスタイルです。このスタイルでは、変換テキストは別個の変換用ウィンドウに表示されます。このウィンドウは、確定後にテキストが挿入される位置の近くに自動的に配置されます。インプットメソッドクライアント API によって、テキスト編集コンポーネントはこれらの統合テキスト入力ユーザーインタフェースを実装できます。
この統合は、単に変換テキストを対象ドキュメントの文脈内に表示することだけを意味するわけではありません。この統合は、テキスト編集コンポーネントが「インプットメソッドイベント」を理解することも意味します。インプットメソッドイベントは、テキストに関する単純なキーイベント以上の情報 (たとえば、文法情報) をインプットメソッドが交換することを可能にします。また、この統合は、インプットメソッドの機能 (たとえば、正確さ) の改善を可能にするインプットメソッド自体からの情報に対する要求にテキスト編集コンポーネントが応答できることを意味します。
テキスト入力操作用のユーザーインタフェースを扱う必要のないプログラムでは、最終的な入力テキストだけがアプリケーションに送られます。この場合、フレームワークが入力操作に提供するユーザーインタフェースは、アプリケーションの外部にある独立した変換用ウィンドウになります。これは、ルートウィンドウスタイルと呼ばれます。ユーザーはウィンドウを手動で挿入位置の近くに配置するか、変換用ウィンドウとアプリケーションウィンドウの間で目を動かす必要があるため、この方式はあまり便利ではありません。
この方式の場合、アプリケーションは、一連のキーイベントとして入力テキストを受け取ります。したがって、入力テキストに関する情報 (文法情報など) を受け取る方法はありません。また、Unicode Standard Version 2.0 で定義されているサロゲートペアは、2 つの独立したキーイベントとして受信されます。
ゲームソフトウェアなど一部のアプリケーションでは、変換されないキー入力だけが必要で、インプットメソッドのサポートを必要としない場合があります。フレームワークでは、インプットメソッドのサポートを明示的に無効にする手段が提供されています。
オブジェクト指向プログラミングの重要なテーマは、プログラム構築ブロックの再利用です。同一の構築ブロックを多数の異なるアプリケーションで使うことができ、同じアプリケーションで何回も使うこともできます。機能の異なるさまざまなテキスト編集構築ブロックの組み合わせを容易にするため、Input Method Framework では、各テキスト編集コンポーネントと直接かつ個別に対話します。
その結果、多くのアプリケーションは Input Method Framework と直接対話することはまったくありません。代わりに、それらのアプリケーションは、アプリケーションとの対話を処理する Swing テキストコンポーネントなど、用意されているテキスト編集コンポーネントを使用します。
Input Method Framework は、Java プラットフォームの一部として設計されています。インプットメソッドとテキストコンポーネントの間でのテキスト交換に必要なインタフェースは、Java 2D や Swing テキストコンポーネントなど、ほかのテキスト関連フレームワークとの間の通信もサポートするように設計されています。Java 2D には、インプットメソッドでの反転描画をサポートする機能が統合されているので、テキストコンポーネントは、変換テキストとほかのテキストを同じように扱うことができ、ほかのスタイルと同じように反転表示スタイルを処理できます。Java 2D は、Input Method Framework と対話し、インプットメソッドの反転表現方法として適切な表示スタイルを、プラットフォームの種類に基づいて決定します。Swing テキストコンポーネントは、Input Method Framework を使用して、最小限の追加のプログラミングで、可能なものの中では最良のユーザーインタフェースを実装します。
この章では、インプットメソッドをサポートするほかの Java プラットフォームのフレームワークにおける機能の概要を説明します。
AttributedCharacterIterator
インタフェースは、属性が付加されたテキスト情報をフレームワーク間で交換するための標準的な手段を提供します。これにより、テキストを読み取る側は、情報提供側でのテキストの格納方法を知らなくても、テキストにアクセスできます。属性情報には、フォントやスタイルの属性だけでなく、言語タグや文法に関する注釈も含まれる場合があります。
Window
クラスは、ウィンドウの初期入力コンテキストを作成し、ウィンドウが破棄される時点でその初期入力コンテキストを破棄します。入力コンテキストを明示的に破棄することで、ネイティブなインプットメソッドに割り当てられていて、ときにかなりの大きさになるリソースを解放できます。
Component
クラスには、入力コンテキストとインプットメソッド要求ハンドラを処理するためのメソッドがあります。ウィンドウ以外の新しく作成された Component
のインスタンスは、最初、それらを含んでいるウィンドウの入力コンテキストを共有します。Component
クラスでのイベント処理は、受け取ったイベントをコンポーネントに関連する入力コンテキストにリダイレクトし、イベントがインプットメソッドで使われない場合は、コンポーネントのリスナーにイベントを渡す処理だけを行います。入力コンテキストがインプットメソッドを起動または停止できるよう、フォーカスの変更は入力コンテキストに通知されます。
イベントクラスまたはリスナークラスの情報を持っている AWT クラスは、InputMethodEvent
クラスおよび InputMethodListener
クラスを処理します。
Graphics
クラスは、AttributedCharacterIterator
インスタンスを入力として受け取る drawString
メソッドを定義します。TextLayout
クラスのインスタンスは、AttributedCharacterIterator
インスタンスから構築することができ、インプットメソッドの反転表示を使ってテキストを描画するのに使えます。どちらのテキストレンダリング法も、インプットメソッドの反転表示をテキストの属性として認識し、レンダリングします。
デフォルトでは、Java 2 プラットフォームの Swing テキストコンポーネントは、Input Method Framework のアクティブクライアントです。つまり、デフォルトでは、これらのテキストコンポーネントを使用するアプリケーションは、オンザスポットスタイルまたはビロウザスポットスタイルを使用します。アプリケーション開発者は、テキストの確定を要求するほかの操作を開始するときは、入力操作の終了を行わなければなりません。Input Method Framework のメソッドを使って、プライベートな入力コンテキストの作成、インプットメソッドの選択、または有効な文字サブセットの設定も可能です。
種々のプラットフォームでのインプットメソッドの実装については、次の書籍を参照してください。