WisdomSoft - for your serial experiences.

4.4 キーボードイベント

コンポーネントがフォーカスを得ている状態でキーボードのキーが押されると、キー入力イベントが発生します。プログラムで入力されたキーのコードや文字を処理する方法を解説します。

4.4.1 キーリスナ

コンポーネントが入力対象になっている状態でキーボードのキーが押されれば、コンポーネントにキーの入力イベントが発生します。キーボードの入力処理も、マウスの入力処理と考え方は同じです。キーボードからの入力を処理するキーリスナを実装して、コンポーネントにリスナを登録すれば、キーボードの入力が発生したときにメソッドが呼び出されます。

Component クラスはキーリスナを登録する addKeyListener() メソッド、キーリスナを解除する removeKeyListener() メソッド、現在登録されているキーリスナを返す getKeyListeners() メソッドを公開しています。 

Component クラス addKeyListener() メソッド
public void addKeyListener(KeyListener l)
Component クラス removeKeyListener() メソッド
public void removeKeyListener(KeyListener l)
Component クラス getKeyListeners() メソッド
public KeyListener[] getKeyListeners()

これらのメソッドで扱うキーリスナは java.awt.event.KeyListener インタフェースです。KeyListener インタフェースではキータイプ、キープレス、キーリリスの 3 つのイベントを処理するメソッドを宣言しています。キープレスとはキーボードの何らかのキーを押したとき、キーリリースは離したときに発生するイベントを指します。キータイプは高水準なイベントで、文字を生成したときに発生するイベントと定義されています。実際のキーボードの配置は完全に隠蔽され、何らかの Unicode 文字が生成できたときだけ呼び出されます。例えば Shift や Alt キーなど、文字を生成しないキーが存在します。これらのキーを処理する必要がなく、タイピングゲームのように入力される文字だけが重要な場合にキータイプイベントを処理します。

KeyListener インタフェースのメソッド
メソッド 解説
void keyPressed(KeyEvent e) キーを押しているときに呼び出されます。
void keyReleased(KeyEvent e) キーを離したときに呼び出されます。
void keyTyped(KeyEvent e) キーをタイプすると呼び出されます。

表1が KeyListener インタフェースが宣言するメソッドの一覧です。これらのメソッドは押されたキーの情報を提供する KeyEvent オブジェクトを受け取ります。java.awt.event.KeyEvent クラスは MouseEvent 同様に InputEvent をスーパー暮らすとする入力イベントの情報提供クラスです。

java.awt.event.KeyEvent クラス
java.lang.Object
  |
  +--java.util.EventObject
        |
        +--java.awt.AWTEvent
              |
              +--java.awt.event.ComponentEvent
                    |
                    +--java.awt.event.InputEvent
                          |
                          +--java.awt.event.KeyEvent
public class KeyEvent extends InputEvent

KeyEvent クラスでは static final int フィールドとして VK_ から始まる定数を公開しています。これは仮想キーと呼び、キーボードのキーを表す数値コードを指しています。KeyEvent クラスの getKeyCode() メソッドがイベントを発生させたキーを表す数値コードを返すため、この数値と VK_ で始まるこのクラスのフィールドを比較すれば、どのキーでイベントが発生したのかを調べることができます。Shift や Alt などの文字を生成しない修飾キーなどの入力を調べることができるでしょう。ただし、keyTyped() メソッドの呼び出しの場合は仮想キーそのものが隠蔽されているので意味がありません。

表2 KeyEvent クラスのメソッド(抜粋)
メソッド 解説
char getKeyChar() このイベントのキーに関連する文字を返します。
int getKeyCode() このイベントのキーに関連した整数型の keyCode を返します。
int getKeyLocation() キーイベントの発生元のキーの位置を返します。
static String getKeyModifiersText(int modifiers) 「Shift キー」や「Ctrl+Shift キー」などの修飾キーを記述する String を返します。
static String getKeyText(int keyCode) 「Home キー」、「F1 キー」、または「A キー」などの keyCode を記述する String を返します。
boolean isActionKey() このイベントのキーが「アクション」キーであるかどうかを返します。

表2は KeyEvent の主なメソッドです。getKeyChar() メソッドがキーイベントで生成された文字を返し、getKeyCode() メソッドがイベントを発生させたキーボードの仮想キーを数値で返します。キーイベントは必ずキーコードを用いますが、必ず文字を生成するとは限りません。必ず文字を生成するイベントはキータイプイベントの場合のみです。

コード1
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

//<applet code="Test.class" width="400" height= "400"></applet>

public class Test extends Applet implements KeyListener {
	private String param = "";

//KeyListener の実装////////////////////////
	public void keyPressed(KeyEvent e) {
		param = e.paramString();
		repaint();
	}
	public void keyReleased(KeyEvent e)  {
		param = e.paramString();
		repaint();
	}
	public void keyTyped(KeyEvent e)  {
		param = e.paramString();
		repaint();
	}
///////////////////////////////////////////

	public void init() { addKeyListener(this); }
	public void paint(Graphics g) {
		g.drawString(param , 0 , g.getFontMetrics().getAscent());
	}
}
実行結果
コード1 実行結果

コード1はキーイベントが発生すると、イベントの情報を表示するアプレットです。アプレット上で一度クリックし、キーの入力対象をアプレットにあわせてからキーボードのキーを押してください。

Test クラスは KeyListener インタフェースを実装しているので、addKeyListener() メソッドでアプレット自身を登録しています。これで、このアプレットにキー入力が発生すると対応するメソッドが呼び出されます。各メソッドではイベント情報を表現する文字列を paramString() メソッドから取得してこれを表示します。