- Home ›
- Applet(アプレット)入門 ›
- イベント処理 ›
- HERE
KeyEventからの情報取得
キーが押された時などはkeyTypedメソッドなどが内部的に呼び出されますが、これらのメソッドの引数として渡されてくるKeyEventには、イベントが発生した時の情報が含まれています。
押されたキーの文字コード
まずgetKeyCharメソッドで押されたキーの文字コードを取得できます。
getKeyChar public char 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メソッドを使います。
getKeyCode public int 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クラスで定義されています。
getModifiersEx public int getModifiersEx()
このイベントに関する拡張修飾子のマスクを返します。拡張修飾子は、イベント が発生した直後の 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キーも同時に押された");
}
}
サンプルプログラム
では簡単なサンプルで、実際に試してみます。
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();
}
}
下記で実際に試して頂くことができます。
キーを打っていただくと、上段にkeyTypedメソッド内で読み取った文字の値が表示され、下段にkeyPressedメソッド内で読み取ったキーの値が表示されます。
( Written by Tatsuo Ikura )
JavaDrive