Java-离开窗口后的键盘状态

Java-离开窗口后的键盘状态,java,events,keyboard,mouse,Java,Events,Keyboard,Mouse,标题可能有点误导,我不知道如何简明扼要地说明我的问题 基本上,我所做的是我使用键盘监听器来找出哪些键是向下的,并据此移动我的游戏角色 问题是,当您在按住键的同时单击窗口外时,我的侦听器没有注册keyReleased事件 我试图通过使用mouse listener和mouseExited事件来修复它,但这并不能一直修复它,有时修复,有时修复 以下是我的实现: 键盘: public void mouseLeftWindow() { for(int i =0;i<KEY_COUNT;i+

标题可能有点误导,我不知道如何简明扼要地说明我的问题

基本上,我所做的是我使用键盘监听器来找出哪些键是向下的,并据此移动我的游戏角色

问题是,当您在按住键的同时单击窗口外时,我的侦听器没有注册keyReleased事件

我试图通过使用mouse listener和mouseExited事件来修复它,但这并不能一直修复它,有时修复,有时修复

以下是我的实现:

键盘:

public void mouseLeftWindow()
{
    for(int i =0;i<KEY_COUNT;i++)
    {
        keys[i] = false;
    }
}

@Override
public void keyPressed(KeyEvent e) 
{
    int keyCode = e.getKeyCode();
    if(keyCode>=0 && keyCode<KEY_COUNT)
    {
        keys[keyCode] = true;
    }
}

@Override
public void keyReleased(KeyEvent e) 
{
    int keyCode = e.getKeyCode();
    if(keyCode>=0 && keyCode<KEY_COUNT)
    {
        keys[keyCode] = false;
    }
}

即使鼠标退出组件,您的程序也将侦听其他按键事件。这意味着您在退出时将所有内容设置为false,但如果仍按某个键,它将立即再次设置为true。我想你要找的是焦点听众而不是鼠标听者

    addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent e) {

        }

        @Override
        public void focusLost(FocusEvent e) {
            keyboard.mouseLeftWindow();
        }

    });
    addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent e) {

        }

        @Override
        public void focusLost(FocusEvent e) {
            keyboard.mouseLeftWindow();
        }

    });