在 Java 中使用 KeyListener

Mohammad Irfan 2023年1月30日 2021年10月2日
  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() 方法。我們還看到了一些演示此介面用法的示例。