キーボードのイベント処理
キーボードからの入力を
直接処理する関数は1つしかありません。
これだけで話が済めば簡単です。
しかし、キーボードのイベントを獲得するためには、
その前に「キーボード・フォーカス」の獲得を行わなければいけません。
「キーボード・フォーカス」というのは、
画面上のどのウィンドウにキーボードの入力が送られるかを示すものです。
キーボード・フォーカスは、アプレットが自由に扱えるとは限りません。
ウィンドウ・システムに特別な要請を送り、
キーボード・フォーカスを獲得したことを確認する必要があります。
キーボード・フォーカスをコントロールするために
次のような関数が Appletクラスに用意されています。
getFocus() は、
皆さんのプログラムの側でいつ呼び出すかを決めなくてはいけません。
通常はマウスのポインタがアプレットの中に入った時か、
マウスのボタンが押された時が適当です。
つまり、mouseEnter() か mouseDown()
のどちらかの関数の中から呼び出すのが普通です。getFocus()を呼ぶと、たいていはすぐ gotFocus()
が続けて呼び出されることになりますが、
システムの都合によっては、しばらく待たされる可能性もあります。)実際のイベント処理の関数の例を見てみましょう。
public void mouseEnter() {
getFocus(); // キーボード・フォーカスを得る
}
public void keyDown( int key ) {
buf.setCharAt( 0, (char)key ); // 押された文字を buf に記憶
repaint(); // paint() を呼び出す
}
public void gotFocus() {
focusFlag = true;
repaint(); // paint() を呼び出す
}
public void lostFocus() {
focusFlag = false;
repaint(); // paint() を呼び出す
}
keyDown()の中での処理は、
マウスのイベント処理と比較すると少し複雑です。
理由は、キーボードのイベントは1文字単位の入力に対応するからです。
通常の C言語の入出力関数のように文字列をまるごと処理できなのが、
「難しく」見える原因でしょう。