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

キー入力を識別する方法について解説します。 マウスイベントのキー修飾の判定についても触れます。
キーボードからの入力を処理するメソッドは次の2つです。

キーボードのイベント処理のメソッド
メソッド名 機能
keyDown(Event,int) キーボードのキーが押された時の処理
keyUp(Event,int) キーボードのキーが放された時の処理

これらのメソッドは キーボードのキーが操作された時、自動的に呼び出されます。 通常のキーボード・イベントの処理は keyDown() だけで十分でしょう。 keyUp() はいつも必要なわけではなく、 たとえばゲームプログラムなどで、 より細かいコントロールのために用意されたメソッドと考えてください。 メソッドの型は boolean、最初の引数は Event クラスのオブジェクトです。 2番目の引数で渡されるのは、キーのコードです。 マシンに依存しない Java言語では、 キーの物理的な位置を認識することはできません。 キーの識別は論理的なキー・コードのみを頼りとします。 普通の文字やリターンキー、バックスペースキー、ctrl+C など 1バイトのアスキーコードが割り当てられたキーの場合、 そのコードの値が int型のデータとして渡されます。 同じ特殊キーでもカーソル移動キーやファンクション・キーなどは、 1バイトのキーコードには対応していません。 これらのキーの場合は、 Eventクラスで独自に定義された staticな int型の定数値が渡されます。 (詳しくは Eventクラスの解説 を参照) 次の例のように使用します。


public void keyDown( Event evt, int key ) {
 
       switch( key ) {
 
        case 003:           // ctrl + C
        case 010:           // バックスペース・キー
        case '\n':          // リターン・キー
        case Event.RIGHT:   // 右へのカーソル移動キー
        case Event.F1:      // F1キー
               : 
       } 

Eventクラスには、 シフト・キー、コントロール・キー、 メタ・キーなどとの組み合わせを判別するメソッドも用意されています。 ただし、これらのメソッドはキーの判別のために 存在するわけではありません。 大文字や ctrl+C などはキー・コードだけで判定されます。 (シフト・キーが押された状態で Cのキーを押されれば、 キーの値は大文字の 'C ' です。 コントロール・キーが押された状態で Cのキーが押されれば、 キーの値は ctrl+C を表す数値 3です。)
 シフト・キーやコントロール・キーの判定は、 むしろマウス操作との組み合わせの処理で利用されます。


public void mouseDrag( Event evt, int x, int y ) {
 
       if( evt.controlDown() ) {
 
           // コントロール・キーを押しながらのドラッグの処理
       } 
       else if( evt.shiftDown() ) {
 
           // シフト・キーを押しながらのドラッグの処理
       } 
               : 

キーボード・フォーカスのメソッド

ウィンドウ・システムでは 複数のアプリケーションが同時に起動されています。 しかしキーボードは1つしか存在しません。 このため、どのウィンドウに対してキー入力のイベントを送るかを 管理する必要があります。これが「キーボード・フォーカス」です。 Appletクラスにはキーボードフォーカスを要求したり、 キーボード・フォーカスの変更に伴う処理を行ったりする メソッドが用意されています。

キーボード・フォーカスの処理のメソッド
メソッド名 機能
gotFocus() キーボード・フォーカスが獲得できた時の処理
lostFocus() キーボード・フォーカスが失われた時の処理
requestFocus() キーボード・フォーカスを要求する

gotFocus()とlostFocus()の2つのメソッドは、 システムによってキーボード・フォーカスが 与えられた時および失われた時に自動的に呼び出されます。 キーボード・フォーカスの有無を表示に反映させたいようなケースでは、 これらのメソッドを利用します。 (キーボードのイベント処理で、いつも必要になるわけではありません。)
requestFocus() は明示的にキーボード・フォーカスを要求するための メソッドで、イベント処理のメソッド群とは扱いが異なります。 mouseEnter() かあるいは mouseDown() のメソッドの中から呼び出してください。 requestFocus() はあくまでも要求を行うものですから、 requestFocus() を呼び出せば絶対フォーカスを得られるという保証はありません。 逆にウィンドウ・システムのポリシーにしたがって、 ブラウザの側で面倒をみてくれるのが普通です。 そのため通常は requestFocus() なしでもキーボードのイベント処理は実現できます。