在 Java 中使用 KeyListener

Mohammad Irfan 2023年10月12日
  1. KeyEvent
  2. 实现 KeyListener 接口
  3. KeyListener 的简单应用
  4. 使用 KeyListener 的简单游戏应用程序
  5. 总结
在 Java 中使用 KeyListener

本教程介绍如何在 Java 中使用 KeyListener 并列出一些示例代码来理解该主题。

KeyListener 是一个处理键盘按键状态变化的接口。正如接口的名称所暗示的那样,它会监听按键并相应地采取行动。

在本教程中,我们将学习如何实现此接口并处理关键事件。

KeyEvent

每当按下键盘键时,KeyEvent 类的一个对象就会通知 KeyListenerKeyEvent 类有一些方法可用于获取有关按键事件的更多信息。下面总结了该类中最重要的三个方法。

  • getKeyChar() 方法获取与事件关联的关键字符。如果我们想为特定键添加一些功能,这种方法非常有用。例如,如果按下 e,则应用程序应退出。
  • getKeyCode() 方法与 getKeyChar() 方法非常相似。它返回与按下的键相关联的整数键代码。
  • isActionKey() 方法可以判断是否按下了操作键(如 Caps Lock)。它返回一个布尔值 true 或 false。

实现 KeyListener 接口

KeyListener 接口监听按键事件并执行一些操作。该接口的声明如下所示。

public interface KeyListener extends EventListener

我们需要在我们的类中重写这个接口的以下三个方法。

  • 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() 方法。我们还看到了一些演示此接口用法的示例。