Input Method Frameworkの概要

目次

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

1. はじめに

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

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

Input Method Frameworkは、テキスト編集時に、テキスト編集コンポーネントとインプット・メソッドの間の共同作業を可能にします。このインプット・メソッド・クライアント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にマッピングされます。

ほとんどの開発者にとってエンジンの独立性は重要なことですが、高度な機能の開発者は、エンジン固有の機能にアクセスしたい場合があります。フレームワークはこのアクセスを許可します。

インプット・メソッドの場合の「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プラットフォームのフレームワークにおける機能の概要を説明します。

Text

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

Abstract Window Toolkit

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

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

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

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

Swing

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


4. 参照

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


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.