トップページ > Java3D入門 > Javaのキーボード入力(1)
Java3Dの話ではないのですが、今回はJavaアプリケーション全般において、キーボード入力を使う方法を 紹介します。 Java3Dの座標変換と組み合わせることで、 自分の入力に応じて図形オブジェクトを動かすことができるようになります。
キーボードからの入力を受け取る方法はいくつかありますが、ここでは“KeyListenerインターフェース” を使うことにします。「インターフェース」というのは、クラスの設計図のようなものです。 作るクラスの名前、クラスに含まれるメソッドの名前や引数の型などが記述されています。 ただし、メソッドの中身、処理内容そのものは記述されていません。 よって、インターフェースを使う場合は決められた名前のとおりメソッドを作り、 かつ、そのメソッドの処理内容を自分で記述することになります。これは、自分が使わないメソッドであっても 必要です。(使わないメソッドがある場合は、メソッドの定義だけを行って中身は何も書かないようにします)
なぜ「キーボード入力クラス」のようなクラスが存在しないのか…についてですが、 もしクラスとしてあらかじめ定義されてしまうと、自分で自由に処理内容を書くことができなくなってしまいます。 (オーバーライドとかもあるのですが、インターフェースを使った方がシンプルで分かりやすいです) よって、完全にユーザーによって処理内容がバラバラであって、かつ、使用する機能の骨組は同じという場合に インターフェースが便利だ…と考えられます。 (複数人で開発する場合はクラス構成を考える人と、実際にクラスの処理内容を記述する人は別の可能性があります。 そういった場合にはインターフェースが仲介役としても役立ちます。 開発者の間における“Interface”だと解釈することもできます。)
実際にKeyListenerインターフェースを実装する方法ですが、 クラスを定義する際には“implements”(インプリメンツ:〜を満たす)キーワードを使います。 もし“keyboard_input”というクラスを作るならば、“class keyboard_input implements KeyListener” というクラス定義になります。このクラス内には、メソッドとして“keyPressed()”、“keyReleased”、 “keyTyped”の3つを実装します。完成したクラスは、最後に“addKeyListener()”メソッドを使って キーボード入力を受け付けるコンポーネントに登録します。 普通、キーボード入力を受け付けるコンポーネントには フレーム(ウィンドウそのもの)やCanvas (画像描画が主なアプリケーションの場合)が選ばれます。
テストプログラムとして、KeyListenerを実装した非常に単純なクラスを作ってみます。 実装した3つのメソッドでは、System.out.println()を使って呼ばれたメソッド名を プロンプト上に表示するように書いています。“keyPressed()”はキーを押したときに呼ばれます。 “keyReleased()”は押していたキーを離したときに呼ばれます。 “keyTyped()”はキーを押したときに呼ばれますが、内容が異なります。 (実際、あまり使いません…)
//****************************************************************************** //Java3D キーボード入力テスト //キーボード入力を表示 //****************************************************************************** //============================================================================== //インポート・ファイル import java.awt.*; import java.awt.event.*; import javax.swing.*; //============================================================================== //メイン・クラス //============================================================================== public class Key_test { //============================================================================= //メイン・メソッド public static void main(String[] args) { Key_test test = new Key_test(); } //============================================================================= //コンストラクタ public Key_test() { //============================================================================ //まずは、基礎フレームの設定。 //============================================================================ JFrame frame = new JFrame(); frame.setSize(250,250); frame.setTitle("Key_test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); //============================================================================ //キーボード・リスナーの設定 //============================================================================ //フレームにキーボード入力の受信を登録 frame.addKeyListener(new Keyboard_input()); } } //============================================================================== //キーボードのためのクラス //============================================================================== class Keyboard_input implements KeyListener { public void keyPressed(KeyEvent event) { //keyPressedに対するメッセージを表示 System.out.println("keyPressed."); } public void keyReleased(KeyEvent event) { //keyReleasedに対するメッセージを表示 System.out.println("keyReleased."); } public void keyTyped(KeyEvent event) { //keyTypedに対するメッセージを表示 System.out.println("keyTyped."); } } //ソースコードここまで。 //******************************************************************************
ただのウィンドウだけが表示されます。このウィンドウにキーボード入力を受信するように 設定しているので、このウィンドウのどこかをクリックしてウィンドウをアクティブに しておく必要があります。
キーボードを押したり離したりして、各メソッドが呼ばれるタイミングを確認します。 [A]や[@]、[Enter]などのキーを押した場合は、“keyPressed.”、“keyTyped.”、“keyReleased.”の 3つが表示されます。それに対して、[↑]などのカーソルキーや[F1]などのファンクションキー を押すと“keyPressed.”と“keyReleased.” の2つしか表示されません。
押されたキーの判別については次ページで扱いますが、Java3Dにおいて図形オブジェクトを動かす時は カーソルキーを使いたくなると思います。keyTyped()はカーソルキーに対して反応しないので、 これから先は無難にkeyPressed()メソッドを使っていくことにします。