All Languages |
English Only |
日本語のみ

Thursday July 02, 2009
JavaFX 1.2とインプット・メソッド
JavaFX 1.2の機能と拡張(英語)の一つとして、インプットメソッドを扱うAPIが加わりました。JavaFX 1.2以前のリリースでは、シーングラフ中のNodeはインプットメソッドで確定された文字列のみを一連のKeyEventとして受け取る事しかできませんでしたが、JavaFX 1.2で新しく加わったAPIを使う事によりNodeはインプットメソッドの変換途中の文字列の情報も受け取れるようになり、アプリケーションが自由に変換途中の状態を表示できるようになります。
JavaFXでインプットメソッドがどのように動作するかという全体のデザインは、JavaのInput Method Frameworkとほぼ同様になっています。特に何もしない場合は(上に書いた通り)、Nodeは変換結果のみをKeyEventとして受け取りますが、NodeがTextInput mixinをextendして実装した場合、インプットメソッドの変換途中の状態がアプリケーションが定義したonInputMethodTextChanged()にInputMethodEventとして通知されます。簡単なコードサンプルを以下に示します。このクラスはCircleのサブクラスでInputMethodEventを受け取れるサンプルです。
class InputMethodCircle extends Circle, TextInput {
override var onInputMethodTextChanged =
function (e:InputMethodEvent): Void {
println(e);
};
}
このサンプルはInputMethodEventが通知されるごとにコンソールにその内容を書き出します。
InputMethodEventには4つの変数があります。node変数はどのNodeでこのイベントが起きたか、composed変数は変換途中の文節を表すInputMethodTextRunのシーケンスを持ち、committedは確定文字列、caretPositionはcomposedテキスト中のキャレット位置をそれぞれ表現しています。アプリケーションは通常InputMethodEventを受け取るとcomposedのInputMethodTextRunにあるそれぞれの文節を指定されたInputMethodHighlightに応じて表示、committedで返された確定文字列をアプリケーションのテキストに挿入、また
caretPositionで指定された位置にキャレットを表示します。
以下はInputMethodEventの内容を表示する別の簡単なサンプルです。サンプルの一行目にあるカラーサンプルは、それぞれの文節の色が示すアトリビュートを示しています
("U-R"が"unselected raw"ハイライト、"S-C"が"selected converted"といった具合です)。上にあげたサンプルよりもちょっとだけ視覚に訴えるようにしてみました。
もしお使いのOSにインプットメソッドがインストールされていない場合、Javaで書かれたインプットメソッドを使ってこのサンプルを試す事もできます。Javaインプットメソッドの使い方は
昔の記事を参照ください。
しかし、もしもあなたのアプリケーションでこの様な詳細な部分まで必要ない場合はどうすれば良いのでしょう?大丈夫。TextBox UIコントロールはこれらの仕組みを既に内部で実装しているので、TextBoxを使えばそれ以上何もしなくていいでしょう。
(2009-07-02 21:52:19.0)
Permalink
|