4.4 キーボードイベント
4.4.1 キーリスナ
コンポーネントが入力対象になっている状態でキーボードのキーが押されれば、コンポーネントにキーの入力イベントが発生します。キーボードの入力処理も、マウスの入力処理と考え方は同じです。キーボードからの入力を処理するキーリスナを実装して、コンポーネントにリスナを登録すれば、キーボードの入力が発生したときにメソッドが呼び出されます。
Component クラスはキーリスナを登録する addKeyListener() メソッド、キーリスナを解除する removeKeyListener() メソッド、現在登録されているキーリスナを返す getKeyListeners() メソッドを公開しています。
public void addKeyListener(KeyListener l)
public void removeKeyListener(KeyListener l)
public KeyListener[] getKeyListeners()
これらのメソッドで扱うキーリスナは java.awt.event.KeyListener インタフェースです。KeyListener インタフェースではキータイプ、キープレス、キーリリスの 3 つのイベントを処理するメソッドを宣言しています。キープレスとはキーボードの何らかのキーを押したとき、キーリリースは離したときに発生するイベントを指します。キータイプは高水準なイベントで、文字を生成したときに発生するイベントと定義されています。実際のキーボードの配置は完全に隠蔽され、何らかの Unicode 文字が生成できたときだけ呼び出されます。例えば Shift や Alt キーなど、文字を生成しないキーが存在します。これらのキーを処理する必要がなく、タイピングゲームのように入力される文字だけが重要な場合にキータイプイベントを処理します。
メソッド | 解説 |
---|---|
void keyPressed(KeyEvent e) | キーを押しているときに呼び出されます。 |
void keyReleased(KeyEvent e) | キーを離したときに呼び出されます。 |
void keyTyped(KeyEvent e) | キーをタイプすると呼び出されます。 |
表1が KeyListener インタフェースが宣言するメソッドの一覧です。これらのメソッドは押されたキーの情報を提供する KeyEvent オブジェクトを受け取ります。java.awt.event.KeyEvent クラスは MouseEvent 同様に InputEvent をスーパー暮らすとする入力イベントの情報提供クラスです。
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() メソッドの呼び出しの場合は仮想キーそのものが隠蔽されているので意味がありません。
メソッド | 解説 |
---|---|
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() メソッドがイベントを発生させたキーボードの仮想キーを数値で返します。キーイベントは必ずキーコードを用いますが、必ず文字を生成するとは限りません。必ず文字を生成するイベントはキータイプイベントの場合のみです。
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はキーイベントが発生すると、イベントの情報を表示するアプレットです。アプレット上で一度クリックし、キーの入力対象をアプレットにあわせてからキーボードのキーを押してください。
Test クラスは KeyListener インタフェースを実装しているので、addKeyListener() メソッドでアプレット自身を登録しています。これで、このアプレットにキー入力が発生すると対応するメソッドが呼び出されます。各メソッドではイベント情報を表現する文字列を paramString() メソッドから取得してこれを表示します。