キー入力


キーボードイベント

今回は、キーボードから文字を受け取ることに挑戦しましょう
キー入力に関しても、GUIプログラムは入力というよりイベントと考えます

キーイベントを受け取るには、ComponentクラスのaddKeyListener()メソッドを使います
これで、キーイベントを受け取るリスナを登録することができます

public synchronized void addKeyListener( KeyListener lis )

ここでKeyListenerという新しい型が出てきましたね
これはjava.awt.event.KeyListenerインターフェイスです
このインターフェイスには、次のメンバが宣言されています

public abstract void keyPressed( KeyEvent e ) キーを押す
public abstract void keyReleased( KeyEvent e ) キーを離す
public abstract void keyTyped( KeyEvent e ) キーを押して離す

しかし、キーが押されたかどうかだけの判定だけでは面白みがありませんね
実用的プログラムにおいては、どのキーが押されたかも知る必要があります
そこでjava.awt.event.KeyEventクラスを利用します
とくに、文字の出力の場合はgetKeyChar()メソッドが役に立ちます
文字ではなく、キーに割り当てられたハンドラ(整数)を得るにはgetKeyCode()メソッドを使用します

public char getKeyChar()
public int getKeyCode()

それぞれのメソッドは、目的のデータを返してくれます
ソースの書き方はマウスイベントの時と同じです
次のプログラムは、押されたキーの文字をコンポーネントに出力します
また、空実装の簡易化にjava.awt.event.KeyAdapterクラスも使用できます
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/*	<applet code="App25.class" width="300"height="300">
 	</applet>
*/

public class App25 extends Applet {
	char ch = 65;
	FontMetrics fo;
	public void init() {
		setBackground(Color.white);
		setFont(new Font("Serif" , Font.BOLD , 100));
		fo = getFontMetrics(getFont());

		addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				ch = e.getKeyChar();
				repaint();
			}
		});
	}
	public void paint(Graphics g) {
		Dimension dim = getSize();
		g.drawString("" + ch , (dim.width / 2) - (fo.charWidth(ch) / 2) , (dim.height / 2));
	}
}
アプレット

アプレットの上にマウスカーソルを移動させ、一度クリックしてフォーカスを合わせてください
コンポーネント(つまりアプレット)にフォーカスがあっている状態で
キーボードのキーを入力すると、その文字がアプレットに表示されます

setFont()getFont()getFontMetrics()メソッドは
まだ紹介していないコンポーネントクラスのメソッドです

public synchronized void setFont( Font f )
public Font getFont()
public FontMetrics getFontMetrics( Font font )

setFont()は、コンポーネントのフォントを指定したフォントオブジェクトのフォントに設定します
getFont()は現在設定されているコンポーネントのフォントを返し
getGontMetrict()は、指定したフォントのフォントメトリックスを返します
以前はGraphicsクラスのメソッドでこのような処理を行っていましたが、起動時に設定したほうが効率が良いですね

しかし、現時点ではEnterキーやTabキーなどに未対応です
そこで、KeyEventクラスはgetKeyCode()で得られた定数を利用します
この定数は、それぞれのキーで割り当てられています

この定数をgetKeyText()メソッドに渡すことで、押されたキーの文字列が返されます
また、"Shift" や "Ctrl+Shift" などのように修飾キーの場合はgetKeyModifiersText()メソッドを使用します

public static String getKeyText( int keyCode )
public static String getKeyModifiersText( int modifiers )

これらを使用することで、文字キー以外のコードを簡単に文字列化できます
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/*	<applet code="App26.class" width="300"height="300">
 	</applet>
*/

public class App26 extends Applet {
	String str = "";
	FontMetrics fo;
	public void init() {
		setBackground(Color.white);
		setFont(new Font("Serif" , Font.BOLD , 18));
		fo = getFontMetrics(getFont());

		addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				str = e.getKeyText(e.getKeyCode());
				repaint();
			}
		});
	}
	public void paint(Graphics g) {
		Dimension dim = getSize();
		g.drawString(str , (dim.width / 2) - (fo.stringWidth(str) / 2) , (dim.height / 2));
	}
}
アプレット

アプレット上で一度クリックしたあとに、キーボードのキーを押してください
今回はEnterなども文字列として表示されます
ただし、キーボードの種類によって特殊なキーが存在したりもします(プラットフォーム固有の)
理解できないコードは、Unknown というような文字列が出て、キーコードが渡されます

getKeyText()をgetKeyModifiersText()に変更してコンパイルもしてください



前のページへ戻る次のページへ