【问题标题】:KeyPress: How to detect if the user pressed the "Down" arrow key on their keyboard when the app is runningKeyPress:如何在应用程序运行时检测用户是否按下了键盘上的“向下”箭头键
【发布时间】:2012-04-07 14:23:22
【问题描述】:

这是我到目前为止所得到的……我将其用作键绑定。我想在应用程序运行时按“向下”箭头键,然后让它自动按“向下”箭头键 3 次,然后在代码中按“Enter”完成。我知道这不是最好的解释,但很抱歉,如果你仍然不明白,我会尽力解释得更好。

代码如下:

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.");
    }

};

我认为向下的键箭头是 1005。 到目前为止,我已经写了 System.out.println("So far, so good..");看看当我按下向下箭头键时应用程序是否检测到它,但它没有......

有什么想法吗?

【问题讨论】:

  • 什么样的应用程序?你在用秋千吗?
  • 没有。我正在使用 JFrame。没有按钮或任何东西,只要我开始运行它,它应该有一个 keyListener 和 if(我按下向下箭头键)它应该检测并执行连续按下向下箭头键 3 次的动作。
  • 一个JFrame是一个swing组件,下面我会贴一些东西来看看
  • 好的,我等着。我很快就要睡觉了,所以明天请检查这个线程,因为我真的需要一些帮助......:D
  • 另外,为了调试和测试,首先检查您的按键事件是否有效,然后检查特定键

标签: java key-bindings keylistener


【解决方案1】:

您可以改用键绑定。教程是here,直接来自 Sun Java 教程。它们是一种更新(我认为更好)的方式来完成上述操作。

如果您打算使用密钥侦听器,请转到this tutorial。它解释了如何做到这一点。

我从来没有像你那样创建一个监听器,所以不是 100% 确定出了什么问题,但我认为这是因为你正在创建一个类来监听关键事件,但你需要在某个地方使用该类否则,它不只是去。不过不确定。

更新:如上所述,在使用您的关键侦听器的类中,您是否添加了它? addKeyListener( new MyKeyListener() );

【讨论】:

    【解决方案2】:

    我只是把它扔在那里,因为我认为它可能对你有用,这是一个虚拟 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]);
        }
    
    }
    

    要根据您的需要进行修改,您可以:

    for(int i = 0; i != 3; ++i) {
    doType(KeyEvent.VK_DOWN);
    }
    

    doType(KeyEvent.VK_DOWN);会按下一次,然后再松开。

    您可能会在代码中的“到目前为止,非常好...”部分之后插入它。

    希望我能帮上忙!

    【讨论】:

    • 朋友先生让我为他想作弊的游戏制作一个看起来很“人性化”的自动打字机...... RuneScape......我很高兴地说他很高兴。跨度>
    • 另外,放置自动打字机也不错。 =]
    • 哈哈很好,我不知道,但我不禁觉得有一天我会想要使用它!
    【解决方案3】:

    KeyEvent 包含关键代码常量(静态 int),例如 VK_DOWN、.VK_A、VK_0 等。 如果您使用像 eclipse 这样的 IDE,它会在您开始输入时显示一个列表。 或者您可以在KeyEvent field summary 中查看完整列表。 这可能会简化您未来程序中的此类编码。

    public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == e.VK_DOWN){
    System.out.println("So far, so good..");
    }
    }
    

    【讨论】:

      【解决方案4】:

      对于对全局事件处理感兴趣的人,我完全推荐我最初发布在这里的答案: How to detect a key press in Java

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 2022-01-12
        • 2018-09-16
        相关资源
        最近更新 更多