- 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 )