Java で KeyListener を使用する

Mohammad Irfan 2023年10月12日
  1. KeyEvent クラス
  2. KeyListener インターフェースの実装
  3. KeyListener の簡単なアプリケーション
  4. KeyListener を使用したシンプルなゲームアプリケーション
  5. まとめ
Java で KeyListener を使用する

このチュートリアルでは、Java で KeyListener を使用する方法を紹介し、トピックを理解するためのサンプルコードをいくつか示します。

KeyListener は、キーボードのキーの状態の変化を処理するインターフェースです。インターフェイスの名前が示すように、キーをリッスンし、それに応じて動作します。

このチュートリアルでは、このインターフェイスを実装し、主要なイベントを操作する方法を学習します。

KeyEvent クラス

キーボードのキーが押されるたびに、KeyEvent クラスのオブジェクトが KeyListener に通知します。KeyEvent クラスには、キーイベントに関する詳細情報を取得するために使用されるいくつかのメソッドがあります。このクラスの最も重要な 3つのメソッドを以下に要約します。

  • getKeyChar() メソッドは、イベントに関連付けられたキー文字をフェッチします。この方法は、特定のキーにいくつかの機能を追加する場合に非常に役立ちます。たとえば、e が押された場合、アプリケーションは終了する必要があります。
  • getKeyCode() メソッドは、getKeyChar() メソッドと非常によく似ています。押されたキーに関連付けられた整数のキーコードを返します。
  • isActionKey() メソッドは、アクションキー(Caps Lock など)が押されたかどうかを判断できます。ブール値の true または false を返します。

KeyListener インターフェースの実装

KeyListener インターフェースは、主要なイベントをリッスンし、いくつかのアクションを実行します。このインターフェースの宣言を以下に示します。

public interface KeyListener extends EventListener

このインターフェイスの次の 3つのメソッドをクラスでオーバーライドする必要があります。

  • keyPressed(KeyEvent e) メソッドは、キーが押されたときに呼び出されます。
  • キーが離されると、keyReleased(KeyEvent e) メソッドが呼び出されます。
  • keyTyped(KeyEvent e) メソッドは、キーが文字を入力したときに呼び出されます。

また、addKeyListener() メソッドを使用します。KeyListener インターフェースを実装するクラスのオブジェクトをこのメソッドに渡す必要があります。これは、重要なイベントをリッスンして反応するようにオブジェクトを登録する方法です。

KeyListener の簡単なアプリケーション

重要なイベントをリッスンし、コンソールに何かを出力する簡単なアプリケーションを作成しましょう。フレームを作成し、それにラベルを追加します。プログラムは、キー文字とキーアクションをコンソールに出力する必要があります。押されたキーがアクションキーの場合、プログラムは終了するはずです。

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyListenerExample implements KeyListener {
  @Override
  public void keyTyped(KeyEvent e) {
    System.out.println("The key Typed was: " + e.getKeyChar());
  }
  @Override
  public void keyPressed(KeyEvent e) {
    if (e.isActionKey())
      System.exit(0);
    System.out.println("The key Pressed was: " + e.getKeyChar());
  }
  @Override
  public void keyReleased(KeyEvent e) {
    System.out.println("The key Released was: " + e.getKeyChar());
  }
  public static void main(String[] args) {
    // Setting the Frame and Labels
    Frame f = new Frame("Demo");
    f.setLayout(new FlowLayout());
    f.setSize(500, 500);
    Label l = new Label();
    l.setText("This is a demonstration");
    f.add(l);
    f.setVisible(true);

    // Creating and adding the key listener
    KeyListenerExample k = new KeyListenerExample();
    f.addKeyListener(k);
  }
}

出力:

The key Pressed was: a
The key Typed was: a
The key Released was: a
The key Pressed was: b
The key Typed was: b
The key Released was: b

KeyListener を使用したシンプルなゲームアプリケーション

矢印キーを入力として受け取る別のプログラムを作成しましょう。このプログラムは、押されたキーに応じて、数値 0 をマトリックス内の別の場所に移動します。出力はコンソールに出力されます。

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;
public class KeyListenerExample implements KeyListener {
  // Matrix and x, y coordinates of 0
  int[][] matrix;
  int x;
  int y;
  KeyListenerExample() {
    // Initializing the Matrix
    matrix = new int[3][3];
    matrix[0] = new int[] {1, 1, 1};
    matrix[1] = new int[] {1, 0, 1};
    matrix[2] = new int[] {1, 1, 1};

    x = 1;
    y = 1;

    // Printing the Matrix
    for (int i = 0; i < 3; i++) System.out.println(Arrays.toString(matrix[i]));
    System.out.println();
  }
  // keyPressed() method takes care of moving the zero according to the key pressed
  @Override
  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
      if (x != 2) {
        x += 1;
        System.out.println("Moving Right");
      } else
        System.out.println("Cannot Move Right");
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
      if (x != 0) {
        x -= 1;
        System.out.println("Moving Left");
      } else
        System.out.println("Cannot Move Left");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      if (y != 2) {
        y += 1;
        System.out.println("Moving Down");
      } else
        System.out.println("Cannot Move Down");
    }
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      if (y != 0) {
        y -= 1;
        System.out.println("Moving Up");
      } else
        System.out.println("Cannot Move Up");
    }
    matrix[0] = new int[] {1, 1, 1};
    matrix[1] = new int[] {1, 1, 1};
    matrix[2] = new int[] {1, 1, 1};
    matrix[y][x] = 0;
    for (int i = 0; i < 3; i++) System.out.println(Arrays.toString(matrix[i]));
    System.out.println();
  }
  // We don't need the other two methods
  @Override
  public void keyReleased(KeyEvent e) {}
  @Override
  public void keyTyped(KeyEvent e) {}
  public static void main(String[] args) {
    // Setting the frame and labels
    Frame f = new Frame("Demo");
    f.setLayout(new FlowLayout());
    f.setSize(200, 200);
    Label l = new Label();
    l.setText("This is a Game");
    f.add(l);
    f.setVisible(true);

    // Creating and adding the key listener
    KeyListenerExample k = new KeyListenerExample();
    f.addKeyListener(k);
  }
}

出力:

[1, 1, 1]
[1, 0, 1]
[1, 1, 1]

Moving Right
[1, 1, 1]
[1, 1, 0]
[1, 1, 1]

Cannot Move Right
[1, 1, 1]
[1, 1, 0]
[1, 1, 1]

Moving Left
[1, 1, 1]
[1, 0, 1]
[1, 1, 1]

Moving Left
[1, 1, 1]
[0, 1, 1]
[1, 1, 1]

Cannot Move Left
[1, 1, 1]
[0, 1, 1]
[1, 1, 1]

Moving Up
[0, 1, 1]
[1, 1, 1]
[1, 1, 1]

Cannot Move Up
[0, 1, 1]
[1, 1, 1]
[1, 1, 1]

Moving Down
[1, 1, 1]
[0, 1, 1]
[1, 1, 1]

Moving Down
[1, 1, 1]
[1, 1, 1]
[0, 1, 1]

Cannot Move Down
[1, 1, 1]
[1, 1, 1]
[0, 1, 1]

まとめ

クラスは、キーイベントをリッスンして反応するための KeyListener インターフェイスを実装します。このチュートリアルでは、KeyEvent クラスのいくつかの重要なメソッドを学びました。また、KeyListener インターフェースを実装する方法と、keyPressed()keyReleased()、および keyTyped() メソッドをオーバーライドする方法も学びました。また、このインターフェースの使用法を示すいくつかの例を見ました。