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メソッドを使います。

このコンポーネントが属する階層の最上位コンポーネントにフォーカスが設定さ
れている場合、コンポーネントが入力フォーカスを取得することを要求します。
許可対象の要求に対してこのコンポーネントが表示可能であり、可視であり、
フォーカス設定可能でなければなりません。この要求を実行するために必要なす
べての処理が行われますが、場合によっては不可能なこともあります。開発者側
では、このコンポーネントが FOCUS_GAINED イベントを受け取るまでフォーカス
所有者ではないことに注意する必要があります。

このメソッドは boolean 型の値を返します。false が返された場合、要求は確
実にエラーになります。true が返された場合、通常は正常に処理されます。た
だし、許可されない、またはコンポーネントのピアが破棄されるなどの異常なイ
ベントが、ネイティブのウィンドウシステムで要求を許可する前に発生した場合
は正常に処理されません。true が返された場合、要求は正常に処理されていま
すが、コンポーネントが FOCUS_GAINED イベントを受け取るまではフォーカスを
取得していないことに開発者は注意しなければなりません。

戻り値:
  フォーカス変更要求が確実にエラーになる場合は false、正常に実行されるよ
    うであれば true

問題はこのメソッドを記述する位置ですが、initメソッドやstartメソッド内でrequestFocusInWindowメソッドを呼んでもフォーカスを取得できませんでした。恐らくこれらの初期化処理が終わった後でないとフォーカス取得が出来ないのではと思います。取りあえずpaintメソッド内に記述しておくことでフォーカス取得が可能でしたのでpaintメソッド内に書いておきます。

サンプルプログラム

では簡単な例で試してみましょう。キーが押された時のイベントの種類を検出して表示します。

EventTest4.java

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;
  }
}

下記で実際に試して頂くことができます。

EventTest4.html

キーを押した時(keyPressedが呼ばれその後でkeyTypedが呼ばれます)

KeyListenerテスト

キーを離した時(keyReleasedが呼ばれます)

KeyListenerテスト

( Written by Tatsuo Ikura )