如何检查用户是否按下了某个键?

问题描述 投票:0回答:4

在java中,我有一个程序需要连续检查用户是否按下了某个键。 所以在伪代码中,类似

if (isPressing("w")) {
   // do somthing
}
java input key
4个回答
52
投票

在 Java 中,您不会检查是否按下了某个键,而是“听”KeyEvent。 实现目标的正确方法是注册一个

KeyEventDispatcher
,并实现它来维持所需键的状态:

import java.awt.KeyEventDispatcher; import java.awt.KeyboardFocusManager; import java.awt.event.KeyEvent; public class IsKeyPressed { private static volatile boolean wPressed = false; public static boolean isWPressed() { synchronized (IsKeyPressed.class) { return wPressed; } } public static void main(String[] args) { KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent ke) { synchronized (IsKeyPressed.class) { switch (ke.getID()) { case KeyEvent.KEY_PRESSED: if (ke.getKeyCode() == KeyEvent.VK_W) { wPressed = true; } break; case KeyEvent.KEY_RELEASED: if (ke.getKeyCode() == KeyEvent.VK_W) { wPressed = false; } break; } return false; } } }); } }

那么您可以随时使用:

if (IsKeyPressed.isWPressed()) { // do your thing. }

当然,您可以使用相同的方法来实现 
isPressing("<some key>")

,并将键映射及其状态封装在

IsKeyPressed
中。
    


5
投票

import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.JTextField; public class Main { public static void main(String[] argv) throws Exception { JTextField textField = new JTextField(); textField.addKeyListener(new Keychecker()); JFrame jframe = new JFrame(); jframe.add(textField); jframe.setSize(400, 350); jframe.setVisible(true); } } class Keychecker extends KeyAdapter { @Override public void keyPressed(KeyEvent event) { char ch = event.getKeyChar(); System.out.println(event.getKeyChar()); } }



2
投票

我基于@Elist 的方法构建了一个方便的实用程序类,它适用于任何键。

import java.awt.*; import java.awt.event.KeyEvent; import java.util.HashMap; import java.util.Map; public class Keyboard { private static final Map<Integer, Boolean> pressedKeys = new HashMap<>(); static { KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(event -> { synchronized (Keyboard.class) { if (event.getID() == KeyEvent.KEY_PRESSED) pressedKeys.put(event.getKeyCode(), true); else if (event.getID() == KeyEvent.KEY_RELEASED) pressedKeys.put(event.getKeyCode(), false); return false; } }); } public static boolean isKeyPressed(int keyCode) { // Any key code from the KeyEvent class return pressedKeys.getOrDefault(keyCode, false); } }

使用示例:

do { if (Keyboard.isKeyPressed(KeyEvent.VK_W)) System.out.println("W is pressed!"); } while (!Keyboard.isKeyPressed(KeyEvent.VK_ESCAPE));



0
投票
KeyListener

,看这里:

http://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyListener.html
有关如何使用它的更多详细信息:

http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

© www.soinside.com 2019 - 2024. All rights reserved.