Java中不使用Scanner/BufferedReader如何获取直接键盘输入检测方向键
Java方向键检测实现方案
你不想使用Scanner、BufferedReader类的需求完全可以满足,这两类工具本身仅能读取可打印字符输入,本身就无法识别方向键这类功能键的输入,可根据你的使用场景选择对应方案:
1. 桌面GUI程序(Swing/AWT/JavaFX)
这类场景直接绑定键盘事件监听器即可实现检测,是最通用的实现方式:
- AWT/Swing实现:给交互组件添加
KeyListener监听器,通过KeyEvent的keyCode判断按键类型
代码示例:import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; public class DirectionKeyDetect { public static void main(String[] args) { JFrame frame = new JFrame("方向键检测"); frame.setSize(300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP -> System.out.println("按下向上方向键"); case KeyEvent.VK_DOWN -> System.out.println("按下向下方向键"); case KeyEvent.VK_LEFT -> System.out.println("按下向左方向键"); case KeyEvent.VK_RIGHT -> System.out.println("按下向右方向键"); } } }); frame.setVisible(true); frame.requestFocus(); } } - JavaFX实现:给场景绑定
onKeyPressed事件,匹配KeyCode枚举值即可
代码示例:import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.scene.input.KeyCode; public class FxDirectionDetect extends Application { @Override public void start(Stage primaryStage) { StackPane root = new StackPane(); Scene scene = new Scene(root, 300, 200); scene.setOnKeyPressed(event -> { KeyCode code = event.getCode(); if (code == KeyCode.UP) System.out.println("按下向上方向键"); else if (code == KeyCode.DOWN) System.out.println("按下向下方向键"); else if (code == KeyCode.LEFT) System.out.println("按下向左方向键"); else if (code == KeyCode.RIGHT) System.out.println("按下向右方向键"); }); primaryStage.setTitle("方向键检测"); primaryStage.setScene(scene); primaryStage.show(); } }
2. 控制台程序
Java标准库没有原生支持控制台功能键检测的能力,可通过JNI调用系统底层输入API,也可以使用封装好的第三方库JLine3实现,全程不需要用到Scanner或BufferedReader:
代码示例:
import org.jline.terminal.Terminal; import org.jline.terminal.TerminalBuilder; import org.jline.utils.NonBlockingReader; public class ConsoleDirectionDetect { public static void main(String[] args) throws Exception { try (Terminal terminal = TerminalBuilder.builder().system(true).build()) { terminal.enterRawMode(); NonBlockingReader reader = terminal.reader(); int input; // 按q键退出程序 while ((input = reader.read()) != 'q') { // 方向键的输入序列以ESC(ASCII值27)开头 if (input == 27) { int seq1 = reader.read(); int seq2 = reader.read(); if (seq1 == '[') { switch (seq2) { case 'A' -> System.out.println("按下向上方向键"); case 'B' -> System.out.println("按下向下方向键"); case 'D' -> System.out.println("按下向左方向键"); case 'C' -> System.out.println("按下向右方向键"); } } } } } } }
内容的提问来源于stack exchange,提问作者dfmaaa1
相关产品推荐
相关产品推荐

