Java KeyPress:如何检测用户在应用程序运行时是否按下了键盘上的“向下”箭头键
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9832195/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
KeyPress: How to detect if the user pressed the "Down" arrow key on their keyboard when the app is running
提问by Mirwais Maarij
Here is what I've got so far.. I'm using this as a keybind. I want to press the "Down" arrow key anytime the app is running, and then make it auto press the "Down" arrow key 3 extra times then finish by pressing "Enter" in the code. I know this isn't the best explanation but sorry and I will try to explain it any better if you still didnt understand.
这是我到目前为止所拥有的..我将其用作键绑定。我想在应用程序运行时按“向下”箭头键,然后让它自动按“向下”箭头键 3 次,然后在代码中按“Enter”键完成。我知道这不是最好的解释,但很抱歉,如果您仍然不明白,我会尝试更好地解释它。
Here is the code:
这是代码:
public class MyKeyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent evt){
}
KeyListener keyListener = new KeyListener() {
@Override
public void keyPressed(KeyEvent keyEvent) {
int keyCode = keyEvent.getKeyCode();
if(keyCode == 1005){
System.out.println("So far, so good..");
}
}
@Override
public void keyTyped(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void keyReleased(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
};
I think the Key arrow down is 1005. I've so far wrote System.out.println("So far, so good.."); to see if the app even detects it when I press the down arrow key, but it doesn't...
我认为向下的关键箭头是 1005。到目前为止,我已经写了 System.out.println("So far, so good.."); 查看应用程序是否在我按下向下箭头键时检测到它,但它没有...
Any ideas please?
请问有什么想法吗?
采纳答案by Xyene
I'm just throwing this out there because I think it MAY be useful to you, this is a virtual Java keyboard, modified from some resource I found on the web years ago and which I no longer remember the link to:
我只是把它扔在那里,因为我认为它可能对你有用,这是一个虚拟的 Java 键盘,从我几年前在网上找到的一些资源修改而来,我不再记得链接到:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
public class Keyboard {
public void main (String[] args) throws InterruptedException {
while(true) {
type("
");
}
}
private static Robot robot;
static Random rand = new Random();
public Keyboard() throws AWTException {
this.robot = new Robot();
}
public Keyboard(Robot robot) {
this.robot = robot;
}
public void type(CharSequence characters) throws InterruptedException {
int length = characters.length();
for (int i = 0; i < length; i++) {
char character = characters.charAt(i);
type(character);
}
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
}
public void type(char character) {
switch (character) {
case 'a': doType(KeyEvent.VK_A); break;
case 'b': doType(KeyEvent.VK_B); break;
case 'c': doType(KeyEvent.VK_C); break;
case 'd': doType(KeyEvent.VK_D); break;
case 'e': doType(KeyEvent.VK_E); break;
case 'f': doType(KeyEvent.VK_F); break;
case 'g': doType(KeyEvent.VK_G); break;
case 'h': doType(KeyEvent.VK_H); break;
case 'i': doType(KeyEvent.VK_I); break;
case 'j': doType(KeyEvent.VK_J); break;
case 'k': doType(KeyEvent.VK_K); break;
case 'l': doType(KeyEvent.VK_L); break;
case 'm': doType(KeyEvent.VK_M); break;
case 'n': doType(KeyEvent.VK_N); break;
case 'o': doType(KeyEvent.VK_O); break;
case 'p': doType(KeyEvent.VK_P); break;
case 'q': doType(KeyEvent.VK_Q); break;
case 'r': doType(KeyEvent.VK_R); break;
case 's': doType(KeyEvent.VK_S); break;
case 't': doType(KeyEvent.VK_T); break;
case 'u': doType(KeyEvent.VK_U); break;
case 'v': doType(KeyEvent.VK_V); break;
case 'w': doType(KeyEvent.VK_W); break;
case 'x': doType(KeyEvent.VK_X); break;
case 'y': doType(KeyEvent.VK_Y); break;
case 'z': doType(KeyEvent.VK_Z); break;
case 'A': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_A); break;
case 'B': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_B); break;
case 'C': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_C); break;
case 'D': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_D); break;
case 'E': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_E); break;
case 'F': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_F); break;
case 'G': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_G); break;
case 'H': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_H); break;
case 'I': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_I); break;
case 'J': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_J); break;
case 'K': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_K); break;
case 'L': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_L); break;
case 'M': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_M); break;
case 'N': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_N); break;
case 'O': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_O); break;
case 'P': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_P); break;
case 'Q': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_Q); break;
case 'R': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_R); break;
case 'S': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_S); break;
case 'T': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_T); break;
case 'U': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_U); break;
case 'V': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_V); break;
case 'W': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_W); break;
case 'X': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_X); break;
case 'Y': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_Y); break;
case 'Z': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_Z); break;
case '`': doType(KeyEvent.VK_BACK_QUOTE); break;
case '0': doType(KeyEvent.VK_0); break;
case '1': doType(KeyEvent.VK_1); break;
case '2': doType(KeyEvent.VK_2); break;
case '3': doType(KeyEvent.VK_3); break;
case '4': doType(KeyEvent.VK_4); break;
case '5': doType(KeyEvent.VK_5); break;
case '6': doType(KeyEvent.VK_6); break;
case '7': doType(KeyEvent.VK_7); break;
case '8': doType(KeyEvent.VK_8); break;
case '9': doType(KeyEvent.VK_9); break;
case '-': doType(KeyEvent.VK_MINUS); break;
case '=': doType(KeyEvent.VK_EQUALS); break;
case '~': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_QUOTE); break;
case '!': doType(KeyEvent.VK_EXCLAMATION_MARK); break;
case '@': doType(KeyEvent.VK_AT); break;
case '#': doType(KeyEvent.VK_NUMBER_SIGN); break;
case '$': doType(KeyEvent.VK_DOLLAR); break;
case '%': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_5); break;
case '^': doType(KeyEvent.VK_CIRCUMFLEX); break;
case '&': doType(KeyEvent.VK_AMPERSAND); break;
case '*': doType(KeyEvent.VK_ASTERISK); break;
case '(': doType(KeyEvent.VK_LEFT_PARENTHESIS); break;
case ')': doType(KeyEvent.VK_RIGHT_PARENTHESIS); break;
case '_': doType(KeyEvent.VK_UNDERSCORE); break;
case '+': doType(KeyEvent.VK_PLUS); break;
case '\t': doType(KeyEvent.VK_TAB); break;
case '\n': doType(KeyEvent.VK_ENTER); break;
case '[': doType(KeyEvent.VK_OPEN_BRACKET); break;
case ']': doType(KeyEvent.VK_CLOSE_BRACKET); break;
case '\': doType(KeyEvent.VK_BACK_SLASH); break;
case '{': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_OPEN_BRACKET); break;
case '}': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_CLOSE_BRACKET); break;
case '|': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SLASH); break;
case ';': doType(KeyEvent.VK_SEMICOLON); break;
case ':': doType(KeyEvent.VK_COLON); break;
case '\'': doType(KeyEvent.VK_QUOTE); break;
case '"': doType(KeyEvent.VK_QUOTEDBL); break;
case ',': doType(KeyEvent.VK_COMMA); break;
case '<': doType(KeyEvent.VK_LESS); break;
case '.': doType(KeyEvent.VK_PERIOD); break;
case '>': doType(KeyEvent.VK_GREATER); break;
case '/': doType(KeyEvent.VK_SLASH); break;
case '?': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_SLASH); break;
case ' ': doType(KeyEvent.VK_SPACE); break;
default:
throw new IllegalArgumentException("Cannot type character " + character);
}
}
private static void doType(int... keyCodes) {
doType(keyCodes, 0, keyCodes.length);
}
private static void doType(int[] keyCodes, int offset, int length) {
if (length == 0) {
return;
}
robot.keyPress(keyCodes[offset]);
doType(keyCodes, offset + 1, length - 1);
robot.keyRelease(keyCodes[offset]);
}
}
To modify this to your needs, you would do:
要根据您的需要修改它,您可以执行以下操作:
for(int i = 0; i != 3; ++i) {
doType(KeyEvent.VK_DOWN);
}
The doType(KeyEvent.VK_DOWN); would press down one time, and then also release it.
doType(KeyEvent.VK_DOWN); 将按下一次,然后也释放它。
You would probably insert that after the "So far, so good..." part in your code.
您可能会在代码中的“到目前为止,很好...”部分之后插入它。
Hope I helped!
希望我有所帮助!
回答by dann.dev
You can use Key Bindings instead. The tutorial is here, direct from the Sun Java tutorials. They are a newer (and I think better) way to do the above.
您可以改用键绑定。教程在这里,直接来自 Sun Java 教程。它们是执行上述操作的更新(我认为更好)的方法。
If you are set on using a key listener then go to this tutorial. It explains how to do it.
如果您开始使用密钥侦听器,请转到本教程。它解释了如何做到这一点。
I have never created a listener the way you are doing it, so not 100% sure what is going wrong but I think it is because you are creating a class to listen for key events, but you need to use that class somewhere else, it doesn't just go. Not sure though.
我从来没有按照你的方式创建过一个监听器,所以不能 100% 确定出了什么问题,但我认为这是因为你正在创建一个类来监听关键事件,但你需要在其他地方使用这个类,它不只是去。虽然不确定。
UPDATE: As above, in the class that uses your key listener, are you adding it? addKeyListener( new MyKeyListener() );
更新:如上所述,在使用您的关键侦听器的类中,您是否添加了它? addKeyListener( new MyKeyListener() );
回答by Ethan McTague
KeyEvent contains key code constants (static int) like VK_DOWN, .VK_A, VK_0, etc. If you are using an IDE like eclipse, it will show you a list as you start typing. Or you can view a complete list in the KeyEvent field summary. This may simplify this kind of coding in your future programs.
KeyEvent 包含关键代码常量(静态整数),如 VK_DOWN、.VK_A、VK_0 等。如果您使用的是Eclipse等 IDE ,它会在您开始输入时显示一个列表。或者,您可以在KeyEvent 字段摘要中查看完整列表。这可能会在您未来的程序中简化这种编码。
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == e.VK_DOWN){
System.out.println("So far, so good..");
}
}
回答by Rav
To people interested in global event handling I totally recommend my answer originally posted here: How to detect a key press in Java
对于对全局事件处理感兴趣的人,我完全推荐我最初发布在这里的答案: How to detection a key press in Java