- Home ›
- Applet(アプレット)入門 ›
- イベント処理 ›
- HERE
KeyListener
今まではマウスに関するイベントを見てきましたが、今度はキー入力に関するイベントです。キーボードが押された時にイベントが発生します。
KeyListenerの場合のリスナーとメソッドの関係は下記の通りです。
実装するリスナー KeyListener リスナーの登録 addKeyListener 発生するイベント KeyEvent 呼ばれるメソッド keyPressed(KeyEvent e) キーが押された場合 keyReleased(KeyEvent e) キーが離された場合 keyTyped(KeyEvent e) キーが押された場合(主に文字キーの検出)
基本的な使い方は下記のようになります。
import java.awt.event.KeyListener; import java.awt.event.KeyEvent; public class EventTest extends Applet implements KeyListener{ public void init(){ addKeyListener(this); } public void keyPressed(KeyEvent e){ } public void keyReleased(KeyEvent e){ } public void keyTyped(KeyEvent e){ } }
基本的な使い方はマウスの場合と同じですが、キー入力独特の注意点として、キーボードイベントを有効にするにはアプレットがフォーカスを持っている必要があります。フォーカスとは文字などが押された時に誰がそれを処理するかということです。つまりキーが押された時、そのキーに対応する処理を行うのが、ブラウザそのものなのかアプレットなのかということです。もしブラウザがフォーカスを持っていた場合は、キーを押してもブラウザで処理さえるだけで(例えばメニューが開くなど)アプレットではキー入力があったのかどうか分かりません。
アプレットにフォーカスを設定するには、Appletクラスの親クラスであるComponentクラスで用意されているrequestFocusInWindowメソッドを使います。
requestFocusInWindow public boolean requestFocusInWindow()
このコンポーネントが属する階層の最上位コンポーネントにフォーカスが設定さ れている場合、コンポーネントが入力フォーカスを取得することを要求します。 許可対象の要求に対してこのコンポーネントが表示可能であり、可視であり、 フォーカス設定可能でなければなりません。この要求を実行するために必要なす べての処理が行われますが、場合によっては不可能なこともあります。開発者側 では、このコンポーネントが FOCUS_GAINED イベントを受け取るまでフォーカス 所有者ではないことに注意する必要があります。 このメソッドは boolean 型の値を返します。false が返された場合、要求は確 実にエラーになります。true が返された場合、通常は正常に処理されます。た だし、許可されない、またはコンポーネントのピアが破棄されるなどの異常なイ ベントが、ネイティブのウィンドウシステムで要求を許可する前に発生した場合 は正常に処理されません。true が返された場合、要求は正常に処理されていま すが、コンポーネントが FOCUS_GAINED イベントを受け取るまではフォーカスを 取得していないことに開発者は注意しなければなりません。 戻り値: フォーカス変更要求が確実にエラーになる場合は false、正常に実行されるよ うであれば true
問題はこのメソッドを記述する位置ですが、initメソッドやstartメソッド内でrequestFocusInWindowメソッドを呼んでもフォーカスを取得できませんでした。恐らくこれらの初期化処理が終わった後でないとフォーカス取得が出来ないのではと思います。取りあえずpaintメソッド内に記述しておくことでフォーカス取得が可能でしたのでpaintメソッド内に書いておきます。
サンプルプログラム
では簡単な例で試してみましょう。キーが押された時のイベントの種類を検出して表示します。
import java.applet.Applet; import java.awt.Graphics; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; /* <applet code="EventTest4.class" codebase="class" width="300" height="100"> </applet> */ public class EventTest4 extends Applet implements KeyListener{ String msg1, msg2, msg3, msg3; public void init(){ msg1 = ""; msg2 = ""; msg3 = ""; addKeyListener(this); } public void start(){ } public void paint(Graphics g){ g.drawString(msg1, 10, 20); g.drawString(msg2, 30, 50); g.drawString(msg3, 30, 80); requestFocusInWindow(); } public void keyPressed(KeyEvent e){ msgChange("keyPressed"); repaint(); } public void keyReleased(KeyEvent e){ msgChange("keyReleased"); repaint(); } public void keyTyped(KeyEvent e){ msgChange("keyTyped"); repaint(); } private void msgChange(String msg){ msg3 = msg2; msg2 = msg1; msg1 = msg; } }
下記で実際に試して頂くことができます。
キーを押した時(keyPressedが呼ばれその後でkeyTypedが呼ばれます)
キーを離した時(keyReleasedが呼ばれます)
( Written by Tatsuo Ikura )