KeyEventからの情報取得

広告

キーが押された時などはkeyTypedメソッドなどが内部的に呼び出されますが、これらのメソッドの引数として渡されてくるKeyEventには、イベントが発生した時の情報が含まれています。

押されたキーの文字コード

まずgetKeyCharメソッドで押されたキーの文字コードを取得できます。

このイベントのキーに関連する文字を返します。たとえば、Shift + 「a」の 
KEY_TYPED イベントは値「A」を返します。

KEY_PRESSED および KEY_RELEASED イベントは文字入力の報告を目的としていま
せん。そのため、このメソッドによって返される値は KEY_TYPED イベントに対
してのみ有効です。

戻り値:
  このキーイベントに対して定義された Unicode 文字。このキーイベント
    に対する有効な Unicode 文字がない場合、CHAR_UNDEFINED が返される

押されたキーがUnicodeとして登録されている文字を表すキーであれば、その文字コードを、そうでなければKeyEvent.CHAR_UNDEFINEDが返されます。押されたキーの文字を調べるという意味合い上、keyTypedメソッドの中で利用するようにします。

public void keyTyped(KeyEvent e){
  char key = e.getKeyChar();
  if (key == 'a'){
    System.out.println("aのキーが押された");
  }
}

押されたキーの文字コード

文字コードが無いような「F1」ボタンなどを検出するにはgetKeyCodeメソッドを使います。

このイベントのキーに関連した整数型の keyCode を返します。

戻り値:
  キーボード上の実際のキーに対応する整数型のコード。KEY_TYPED イベントの
    場合、keyCode は VK_UNDEFINED

これは各キーに対して定義されているコードを取得します。keyPressedメソッドの中で使います。コードKeyEventクラスで定義されており下記のようなものがあります。

KeyEvent.VK_0 から KeyEvent.VK_0    数字の0から9に対応
KeyEvent.VK_A から KeyEvent.VK_Z    アルファベットのAからZに対応
KeyEvent.VK_F1 から KeyEvent.VK_F12 ファンクションキーのF1からF12に対応
KeyEvent.VK_UP                      矢印キーの上
KeyEvent.VK_DOWN                    矢印キーの下
KeyEvent.VK_RIGHT                   矢印キーの右
KeyEvent.VK_LEFT                    矢印キーの左
KeyEvent.VK_ENTER                   ENTERキー
KeyEvent.VK_SHIFT                   SHIFTキー
KeyEvent.VK_ALT                     ALTキー
KeyEvent.VK_CONTROL                 CONTROLキー

他にも一通りのキーに対してコードが割り当てられていますので、これらの値と比較することで押されたキーの種類を判別可能です。

public void keyPressed(KeyEvent e){
  int keycode = e.getKeyCode();
  if (key == KeyEvent.VK_UP){
    System.out.println("矢印上キーが押された");
  }
}

Shiftなどが同時に押されたかどうかの判別

getKeyCodeメソッドを使えば、各修飾キーが押されたかどうかを判別できますが、「Shift+A」など同時に押された時に「Shift」と「A」が同時に押されたのかどうかの判別には使えません。

このような場合にあどの修飾キーが同時に押されているのかを判別するにはgetModifiersExメソッドを使います。このメソッドは親クラスのInputEventクラスで定義されています。

このイベントに関する拡張修飾子のマスクを返します。拡張修飾子は、イベント
が発生した直後の Alt、Ctrl、Meta キーやマウスボタンなど、すべてのモーダ
ルキーの状態を表します。

戻り値:
  拡張修飾子のマスク

帰ってくる値は整数型の値ですが、InputEventクラスで定義されている下記の定数とAND比較することで、どの修飾キーが押されたのかを判別が可能です。

InputEvent.SHIFT_DOWN_MASK   Shiftボタン
InputEvent.ALT_DOWN_MASK     ALTボタン
InputEvent.CTRL_DOWN_MASK    CTRLボタン
InputEvent.META_DOWN_MASK    METAボタン

それぞれの値はビットマスクの形になっていますので、複数の修飾キーが押された場合でも、判別が可能です。

下記では矢印キーが押されたかどうかを判別すると同時に、Shiftキーも押されているのかを判別しています。

public void keyPressed(KeyEvent e){
  int keycode = e.getKeyCode();
  if (key == KeyEvent.VK_UP){
    System.out.println("矢印上キーが押された");
  }

  int mod = e.getModifiersEx();
  if ((mod & InputEvent.SHIFT_DOWN_MASK) != 0){
    System.out.println("Shiftキーも同時に押された");
  }
}

サンプルプログラム

では簡単なサンプルで、実際に試してみます。

EventTest5.java

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;

/*
<applet code="EventTest5.class" codebase="class" width="300" height="100">
</applet>
*/

public class EventTest5 extends Applet implements KeyListener{
  String typekey;
  String presskey;

  public void init(){
    typekey = "";
    presskey = "";
    addKeyListener(this);
  }

  public void start(){
  }

  public void paint(Graphics g){
    g.drawString(typekey, 10, 20);
    g.drawString(presskey, 10, 50);

    requestFocusInWindow();
  }

  public void keyPressed(KeyEvent e){
    int keycode = e.getKeyCode();
    presskey = e.getKeyText(keycode);

    int mod = e.getModifiersEx();

    if ((mod & InputEvent.SHIFT_DOWN_MASK) != 0){
      presskey += " +SHIFT";
    }

    if ((mod & InputEvent.ALT_DOWN_MASK) != 0){
      presskey += " +ALT";
    }

    if ((mod & InputEvent.CTRL_DOWN_MASK) != 0){
      presskey += " +CTRL";
    }

    repaint();
  }

  public void keyReleased(KeyEvent e){
  }

  public void keyTyped(KeyEvent e){
    char key = e.getKeyChar();
    typekey += key;

    repaint();
  }
}

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

EventTest5.html

キーを打っていただくと、上段にkeyTypedメソッド内で読み取った文字の値が表示され、下段にkeyPressedメソッド内で読み取ったキーの値が表示されます。

KeyEventテスト

( Written by Tatsuo Ikura )