キーボードのイベント処理

Appletクラスにあらかじめ組み込まれた キーボードのイベント処理の機能を説明します。
キーボードからの入力を 直接処理する関数は1つしかありません。

この関数は、 キーボードのキーのどれかが押された時、自動的に呼び出されます。 引数で渡されるのは、押されたキーのコードです。

これだけで話が済めば簡単です。 しかし、キーボードのイベントを獲得するためには、 その前に「キーボード・フォーカス」の獲得を行わなければいけません。
「キーボード・フォーカス」というのは、 画面上のどのウィンドウにキーボードの入力が送られるかを示すものです。 キーボード・フォーカスは、アプレットが自由に扱えるとは限りません。 ウィンドウ・システムに特別な要請を送り、 キーボード・フォーカスを獲得したことを確認する必要があります。
キーボード・フォーカスをコントロールするために 次のような関数が Appletクラスに用意されています。

このうち getFocus() は、 皆さんのプログラムの側でいつ呼び出すかを決めなくてはいけません。 通常はマウスのポインタがアプレットの中に入った時か、 マウスのボタンが押された時が適当です。 つまり、mouseEnter()mouseDown() のどちらかの関数の中から呼び出すのが普通です。
残りの2つの関数は、システムによってキーボード・フォーカスが 与えられた時および失われた時に自動的に呼び出されます。 (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言語の入出力関数のように文字列をまるごと処理できなのが、 「難しく」見える原因でしょう。