Java

Input Method Framework の概要

目次

  1. はじめに
  2. 目標
  3. ほかのフレームワークでのインプットメソッドのサポート
  4. FAQ
  5. 参照


1. はじめに

インプットメソッドは、キー入力、音声入力、ペンデバイスを使った手書き入力などのユーザ操作を変換し、アプリケーションへのテキスト入力を生成するソフトウェアコンポーネントです。 もっとも一般的なインプットメソッドは、中国語や日本語や韓国語など数千の異なる文字を使う言語を、通常のサイズのキーボードで入力できるようにするためのものです。 テキストの入力は通常サイズのキーボードで扱える形式 (たとえばローマ字) で行われて、入力されたあとでテキストは目的の言語の形式に変換されます。 一般に、複数の文字を入力してから、1 つのかたまりとして変換する必要があります。 また、変換候補が 1 つだけではないこともあるので、変換を繰り返し行わなければならない場合があります。 同様に、手書き文字の認識では、ユーザは一連の文字を書き、変換し、複数の変換結果候補から正しいテキストを選択します。 このプロセスを「変換」と呼び、インプットメソッドの作業対象になっているテキストを「変換テキスト」と呼びます。 このプロセスはユーザが最終的な変換結果を確定すると終了し、テキストが「確定」します。

変換中は、変換テキストは論理的に言ってインプットメソッドに属していますが、ユーザに対して表示する必要があります。 そのために、Input Method Framework はインプットメソッドと協調して、少なくとも 2 種類の方法を提供します。 最新のテキスト編集コンポーネントの場合は、最終的に配置されることになるドキュメント内の位置に、インプットメソッドによる変換または確定がまだ必要であることを示す形式で、入力テキストを表示できます。 この方法を、「オンザスポット」スタイルの入力と呼びます。 また、確定してからでないとテキストを扱えない旧式のテキスト編集コンポーネントの場合は、代替手段として、テキストを別のウィンドウで表示できるようにします。 この方法を、「ルートウィンドウ」スタイルの入力と呼びます。

Java 2 プラットフォームの Input Method Framework は、テキスト入力時に、テキスト編集コンポーネントとインプットメソッド間の共同作業を可能にします。 この Input Method Framework のインプットメソッドクライアント API は、テキスト編集コンポーネントがインプットメソッドと通信し、十分に統合されたテキスト入力ユーザインタフェースをオンザスポットスタイルまたはビローザスポットスタイルで実装することを可能にするインタフェースとクラスを提供します。また、この API は、代替手段としてルートウィンドウスタイルの入力方法を提供します。 この API のインプットメソッドエンジン用の Service Provider Interface (SPI) は、任意の Java 実行環境で使える Java プログラミング言語を使ったインプットメソッドの開発を可能にするインタフェースを提供します。また、この SPI は、ホストプラットフォームのネイティブなインプットメソッドをサポートします。


2. 目標

テキストコンポーネントの場合の「Write Once, Run Anywhere in the World」

Input Method Framework を使うテキスト編集コンポーネントは、任意の Java アプリケーション環境で動作し、その Java アプリケーション環境で利用可能なテキストインプットメソッドをサポートします。 テキスト編集コンポーネントの変更または再コンパイルは、必要ありません。 Input Method Framework によって、テキスト編集コンポーネントは、プラットフォームおよびインプットメソッドエンジンの間にある違いから切り離されます。 インプットメソッドと対話するための方法として、ただ 1 つのプログラミングモデルが提供されます。 これにより、開発者は 1 つの API に対してだけプログラムを記述すればよく、ユーザは目的に合ったインプットメソッドを選択できます。 ネイティブなインプットメソッドを使うと、Input Method Framework によってプラットフォームのインプットメソッド API にマッピングされます。

ほとんどの開発者にとってエンジンの独立性は重要なことですが、高度な機能の開発者には、エンジンに固有の機能が必要になる場合があります。 Input Method Framework ではこの必要を満たすことができます。

インプットメソッドの場合の「Write Once, Run Anywhere in the World」

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 を使用して、最小限の追加のプログラミングで、可能なものの中では最良のユーザインタフェースを実装します。


3. ほかのフレームワークでのインプットメソッドのサポート

この章では、インプットメソッドをサポートするほかの Java プラットフォームのフレームワークにおける機能の概要を説明します。

テキスト

AttributedCharacterIterator インタフェースは、属性が付加されたテキスト情報をフレームワーク間で交換するための標準的な手段を提供します。 これにより、テキストを読み取る側は、情報提供側でのテキストの格納方法を知らなくても、テキストにアクセスできます。 属性情報には、フォントやスタイルの属性だけでなく、言語タグや文法に関する注釈も含まれる場合があります。

Abstract Window Toolkit

Window クラスは、ウィンドウの初期入力コンテキストを作成し、ウィンドウが破棄される時点でその初期入力コンテキストを破棄します。 入力コンテキストを明示的に破棄することで、ネイティブなインプットメソッドに割り当てられていて、時にかなりの大きさになるリソースを解放できます。

Component クラスには、入力コンテキストとインプットメソッド要求ハンドラを処理するためのメソッドがあります。 ウィンドウ以外の新しく作成された Component のインスタンスは、最初、それらを含んでいるウィンドウの入力コンテキストを共有します。 Component クラスでのイベント処理は、受け取ったイベントをコンポーネントに関連する入力コンテキストにリダイレクトし、イベントがインプットメソッドで使われない場合は、コンポーネントのリスナーにイベントを渡す処理だけを行います。 入力コンテキストがインプットメソッドを起動または停止できるよう、フォーカスの変更は入力コンテキストに通知されます。

イベントクラスまたはリスナークラスの情報を持っている AWT クラスは、InputMethodEvent クラスおよび InputMethodListener クラスを処理します。

Graphics クラスは、AttributedCharacterIterator インスタンスを入力として受け取る drawString メソッドを定義します。 TextLayout クラスのインスタンスは、AttributedCharacterIterator インスタンスから構築することができ、インプットメソッドの反転表示を使ってテキストを描画するのに使えます。 どちらのテキスト描画法も、インプットメソッドの反転表示をテキストの属性として認識し、レンダリングします。

Swing

デフォルトでは、Java 2 プラットフォームの Swing テキストコンポーネントは、Input Method Framework のアクティブクライアントです。 つまり、デフォルトでは、これらのテキストコンポーネントを使用するアプリケーションは、オンザスポットスタイルまたはビローザスポットスタイルを使用します。 アプリケーション開発者は、テキストの確定を要求するほかの操作を開始するときは、入力操作の終了を行わなければなりません。 Input Method Framework のメソッドを使って、プライベートな入力コンテキストの作成インプットメソッドの選択、または有効な文字サブセットの設定も可能です。


4. FAQ

インプットメソッドは Java プラットフォームの以前のバージョンではどのようにサポートされていますか。

Java プラットフォームにおけるインプットメソッドのサポートの履歴を次に示します。

クライアントコンポーネントが名前でインプットメソッドを選択することを可能にする方法がないのはなぜですか。

Input Method Framework では、クライアントコンポーネントは名前ではなくロケールでインプットメソッドを選択します。 どのインプットメソッドを使って所定の言語のテキストを入力するかはユーザが選択し、テキストコンポーネントは任意のインプットメソッドで動作するよう記述する必要があります。 テキストコンポーネントで特定のインプットメソッドの拡張機能を利用する場合は、getInputMethodControlObject を呼び出すことができ、結果がテキストコンポーネントの認識しているクラスのインスタンスである場合は、そのメソッドを呼び出すことができます。

どうすれば IIIMP アダプタを取得できますか。

Java 2 Runtime Environment のバージョン 1.2 には、Internet-Intranet Input Method Protocol (IIIMP) のクライアント側アダプタが含まれていました。IIIMP は、ネットワーク上でサーバベースのインプットメソッドの使用を可能にする Sun Microsystems の技術です。 このアダプタは、ユーザがアダプタを別々のソフトウェアコンポーネントとして Java 実行時環境にインストールすることを可能にする public インタフェースがない場合に、このプロトコルの評価を可能にするためにありました。 Java 2 プラットフォームのバージョン 1.3 は、public インプットメソッドエンジン SPI を提供しており、このアダプタは、ほかの入力システムと同様、独立した製品として開発および配布して、Java 2 プラットフォームの実装にインストールできるようになりました。 現在、SPI を使用する IIIMP アダプタが Sun Microsystems によって開発されています。 最新の情報については、Solaris Developer Connection にアクセスして「IIIM」を検索してください。


5. 参照

種々のプラットフォームでのインプットメソッドの実装については、次の書籍を参照してください。


Copyright © 1995-99 Sun Microsystems, Inc. All Rights Reserved.

コメントの送付先: java-intl@java.sun.com

Sun
Java ソフトウェア